代码之家  ›  专栏  ›  技术社区  ›  Canovice

使用ggplot2中的条形图气泡(geom_点)创建条形图

  •  1
  • Canovice  · 技术社区  · 7 年前

    我正试图创建一个条形图,除非条形图被相互叠放的圆所取代。我有以下公司价值的数据集:

    > 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
    

    图表应该有三个栏,分别为2015年、2016年和2017年。每个条形图都由不同大小的圆形组成,底部是最大的圆形,顶部是最小的圆形。使用 value 列,我计算y值 cumValues 对于这些圆:

    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) 
    

    …并收到以下信息:

    enter image description here

    这是 关闭 不管怎样,我都在为两个方面的问题苦苦挣扎。 弗斯特 最重要的是-圆圈重叠太多。我想让一个圆的底部接触它下面的圆的顶部。或者只是有点重叠。但并没有目前图表中显示的那么多。

    在计算cumValues时,我尝试使用不同的函数,也尝试使用ggplots scale_size_continuous函数,但没有任何效果。我也尝试过使用缩放半径,但也失败了。

    任何帮助这将是非常感谢,因为我认为这是一个很酷的类型的图表,我正在努力建立。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Jon Spring    7 年前

    下面是一个使用 ggforce::geom_circle 精确控制圆的位置。我遇到的挑战是原始数据的数字高度为100+,但数字宽度仅为2(2015年至2017年),但是 ggforce::风水圈 创建一个与坐标成比例的圆。所以如果我们保持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)
    

    enter image description here