在ggplot2中使用泡泡换条形图(geom_point)创建条形图

卡诺维奇

我正在尝试创建一个条形图,除了条形图由彼此叠置的圆圈代替。我在公司价值下面有这个数据集:

> dput(my.data)
structure(list(name = c("JUU", "Lyf", "Inf", "Coi", "Tan", "Rob", 
"Out", "Zen", "Com", "Pel", "Con", "Soc", "Ind", "Cro", "GRA", 
"Osc", "Zoo", "Kat", "Pro", "Nia", "Uni", "23a", "Ope", "Upt", 
"Qua", "Aff", "App", "Ava", "Gus", "Zoc", "Apt", "Spr", "red", 
"War", "Car", "Buz", "Quo", "Squ", "Afi", "Jet", "C3 ", "Hea", 
"Hum", "Nex", "STX", "Roc", "Avi", "Off", "Gin", "App", "Doc", 
"Rub", "Thu", "Zet", "Med", "Rub", "Clo", "Mar", "Kab", "Dra", 
"Vox", "Des", "Ada", "Age", "Ken", "SMS", "Sup", "Sym", "Zoo", 
"Par"), value = c(38, 15, 10, 8.05, 6.7, 5.6, 5.51, 4.5, 4.4, 
4.15, 4, 4, 3.45, 3.35, 3.2, 3.2, 3.2, 3, 3, 2.7, 2.6, 2.5, 2.47, 
2.3, 2.27, 2, 2, 2, 2, 2, 1.86, 1.81, 1.8, 1.75, 1.74, 1.7, 1.7, 
1.7, 1.6, 1.6, 1.51, 1.5, 1.5, 1.5, 1.5, 1.41, 1.4, 1.39, 1.38, 
1.35, 1.32, 1.3, 1.3, 1.3, 1.25, 1.23, 1.2, 1.2, 1.18, 1.07, 
1.07, 1.02, 1, 1, 1, 1, 1, 1, 1, 0.08), year = c(2017, 2015, 
2016, 2017, 2015, 2017, 2017, 2015, 2016, 2017, 2015, 2015, 2017, 
2017, 2017, 2015, 2016, 2017, 2016, 2017, 2016, 2015, 2016, 2015, 
2016, 2017, 2017, 2015, 2015, 2015, 2015, 2015, 2017, 2015, 2017, 
2015, 2017, 2017, 2017, 2016, 2017, 2017, 2016, 2015, 2016, 2017, 
2017, 2016, 2017, 2015, 2015, 2017, 2015, 2015, 2015, 2017, 2017, 
2015, 2015, 2015, 2015, 2017, 2015, 2016, 2016, 2016, 2017, 2017, 
2017, 2017)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-70L))

> head(my.data, 10)
# A tibble: 10 x 3
   name  value  year
   <chr> <dbl> <dbl>
 1 JUU   38     2017
 2 Lyf   15     2015
 3 Inf   10     2016
 4 Coi    8.05  2017
 5 Tan    6.7   2015
 6 Rob    5.6   2017
 7 Out    5.51  2017
 8 Zen    4.5   2015
 9 Com    4.4   2016
10 Pel    4.15  2017

图表应包含3条,每条分别代表2015年,2016年和2017年。每个条由大小不同的圆圈组成,最大的圆圈在底部,最小的圆圈在顶部。使用该value列,我计算出cumValues这些圆的y值

my.data <- my.data %>% 
  dplyr::arrange(desc(value)) %>% 
  dplyr::group_by(year) %>%
  # dplyr::mutate(cumValues = cumsum(valueEoy2018 ^ 0.5)) %>%
  dplyr::mutate(cumValues = cumsum(value)) %>%
  dplyr::ungroup()

> head(my.data %>% dplyr::filter(year == 2017))
# A tibble: 6 x 4
  name  value  year cumValues
  <chr> <dbl> <dbl>     <dbl>
1 JUU   38     2017      38  
2 Coi    8.05  2017      46.0
3 Rob    5.6   2017      51.6
4 Out    5.51  2017      57.2
5 Pel    4.15  2017      61.3
6 Ind    3.45  2017      64.8

...最后,我创建了散点图:

  minValue = min(my.data$value)
  maxValue = max(my.data$value)
  valueRange = c(minValue, maxValue)
  my.data %>%
    ggplot() +
    geom_point(aes(x = year, y = cumValues, size = value),
               alpha = 0.95, pch = 21, fill = colorGold, color = 'black') +
    geom_text(aes(x = year, y = cumValues, label = ifelse(value > 5, name, '')),
              size = 3, fontface = 'bold', hjust = 0.4, vjust = 1.) +
    scale_size_continuous(range = valueRange) 

...并收到以下信息:

在此处输入图片说明

接近我想要的,但是我在两个方面都在挣扎。首先,也是最重要的-圆圈重叠太多。我希望一个圆圈的底部触摸其下方的圆圈的顶部。或只是一点重叠。但不如目前的图表那么多。

在计算cumValues时,我尝试使用其他函数,并且还尝试使用ggplots scale_size_continuous函数,但无济于事。我也尝试过使用scale_radius,但是也没有成功。

对此的任何帮助将不胜感激,因为我认为这是我尝试构建的一种很酷的图形。

乔恩·斯普林

这是一种ggforce::geom_circle用于精确控制圆放置的方法。我遇到的挑战是原始数据的数字高度为100+,但数字宽度仅为2(2015年至2017年),但是ggforce::geom_circle创建了一个与坐标成比例的圆。因此,如果我们原样保留x和y,您将获得一个非常高且狭窄的图表,否则您将得到一个非常狭窄的圆圈。我的技巧是从一开始就扩展值。(我使用它们的平方根,以便将值缩放到面积而不是半径。)

我不确定最终的图表中是否会使用y值。如果您可以放下它们,那么就足够了,但是如果您需要它们,则可以手动更改y中断处的标签,也可以使用贴标签机使它们以原始比例显示。

my.data <- my.data %>% 
  dplyr::arrange(desc(value)) %>% 
  dplyr::group_by(year) %>%
  dplyr::mutate(value_sqrt = sqrt(value/100),
                cum_value_sqrt = cumsum(value_sqrt),
                height = cum_value_sqrt - value_sqrt/2) %>%
  dplyr::ungroup()

my.data %>%
  ggplot() +
  ggforce::geom_circle(aes(x0 = year, 
                           y0 = height, 
                           r = value_sqrt/2),
             alpha = 0.95, fill = "gold", color = 'black') +
  geom_text(aes(x = year, y = height, label = ifelse(value > 5, name, '')),
            size = 3, fontface = 'bold', hjust = 0.4, vjust = 1) +
  scale_x_continuous(breaks = 2015:2017, minor_breaks = F) +
  coord_equal(ratio = 1)

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章