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

带R ggplot2的组合条形图:闪避和堆叠

  •  0
  • astrsk  · 技术社区  · 7 年前

    period,amount,a1,a2,b1,b2,h1,h2,h3,h4
    J,18.1,30,60,40,60,15,50,30,5
    K,29,65,35,75,25,5,50,40,5
    P,13.3,94,6,85,15,10,55,20,15
    N,21.6,95,5,80,20,10,55,20,15
    

    第一列(周期)是地质时代。它将在x轴上,我不需要对其进行额外排序,所以我用命令准备了适当的因子标签

    reserves$period <- factor(reserves$period, levels = reserves$period)
    

    “数量”列是绘制为y轴的主列(它是每个时代中碳氢化合物的百分比,但也可以是绝对值,例如,数百万吨或任何值)。因此,基本图由命令调用:

    ggplot(reserves,aes(x=period,y=amount)) + geom_bar(stat="identity")
    

    布局如下:

    layout of a combined barplot

    我了解到,我首先需要使用包整形2来整形数据,然后在geom_bar()中使用选项position=“dodge”或position=“fill”,但这里是它们的组合。第三个条形图(h1-h4值)似乎需要固定高度的“堆叠百分比”表示。

    是否有以更直观的方式处理绘图数据的软件包?比如说,我们只是声明,我们想要绘制变量ai,bi,hi。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Brian    7 年前

    首先,您应该将数据从宽改为长,然后根据原始值调整比例。然后将旧列名(现在是“lett”级别)拆分为字母和数字以进行标记。如果你的真实数据不是这样格式化的(a1…h4),也有办法处理。

    library(dplyr)
    library(tidyr)
    library(ggplot2)
    
    reserves <- read.csv(text = "period,amount,a1,a2,b1,b2,h1,h2,h3,h4
    J,18.1,30,60,40,60,15,50,30,5
    K,29,65,35,75,25,5,50,40,5
    P,13.3,94,6,85,15,10,55,20,15
    N,21.6,95,5,80,20,10,55,20,15") 
    
    reserves.tidied <- reserves %>% 
      gather(key = lett, value = prop, -period, -amount) %>% 
      mutate(rawvalue = prop * amount/100,
             lett1 = substr(lett, 1, 1),
             num = substr(lett, 2, 2)) 
    
    reserves.tidied
    
       period amount lett prop rawvalue lett1 num
    1       J   18.1   a1   30    5.430     a   1
    2       K   29.0   a1   65   18.850     a   1
    3       P   13.3   a1   94   12.502     a   1
    4       N   21.6   a1   95   20.520     a   1
    5       J   18.1   a2   60   10.860     a   2
    6       K   29.0   a2   35   10.150     a   2
    7       P   13.3   a2    6    0.798     a   2
    8       N   21.6   a2    5    1.080     a   2
    9       J   18.1   b1   40    7.240     b   1
    10      K   29.0   b1   75   21.750     b   1
    11      P   13.3   b1   85   11.305     b   1
    12      N   21.6   b1   80   17.280     b   1
    13      J   18.1   b2   60   10.860     b   2
    14      K   29.0   b2   25    7.250     b   2
    15      P   13.3   b2   15    1.995     b   2
    16      N   21.6   b2   20    4.320     b   2
    17      J   18.1   h1   15    2.715     h   1
    18      K   29.0   h1    5    1.450     h   1
    19      P   13.3   h1   10    1.330     h   1
    20      N   21.6   h1   10    2.160     h   1
    21      J   18.1   h2   50    9.050     h   2
    22      K   29.0   h2   50   14.500     h   2
    23      P   13.3   h2   55    7.315     h   2
    24      N   21.6   h2   55   11.880     h   2
    25      J   18.1   h3   30    5.430     h   3
    26      K   29.0   h3   40   11.600     h   3
    27      P   13.3   h3   20    2.660     h   3
    28      N   21.6   h3   20    4.320     h   3
    29      J   18.1   h4    5    0.905     h   4
    30      K   29.0   h4    5    1.450     h   4
    31      P   13.3   h4   15    1.995     h   4
    32      N   21.6   h4   15    3.240     h   4
    

    然后,为了绘制整理后的数据,需要横穿x轴的字母,以及我们刚刚用y轴上的数量*比例计算的原始值。我们把食物堆起来 geom_col 从1增加到2或从1增加到4(即 reverse=T alpha fill

    然后 geom_text 用名称、换行符和原始百分比标记每个堆叠段,以每个段为中心。这个 scale 再次反转默认行为,使每个条中的1最暗,2或4最亮。那你呢 facet

      ggplot(reserves.tidied, 
             aes(x = lett1, y = rawvalue, alpha = num, fill = lett1)) +
        geom_col(position = position_stack(reverse = T), colour = "black") +
        geom_text(position = position_stack(reverse = T, vjust = .5), 
                  aes(label = paste0(lett, ":\n", prop, "%")), alpha = 1) +
        scale_alpha_discrete(range = c(1, .1)) +
        facet_grid(~period) +
        guides(fill = F, alpha = F) 
    

    enter image description here

    重新排列它,使“h”条不同于“a”和“b”条,这有点复杂,你必须考虑如何呈现它,但这是完全可行的。