【问题标题】:Stacking means of multiple variables in an area plot面积图中多个变量的堆叠均值
【发布时间】:2020-11-16 19:46:48
【问题描述】:

我想制作一个面积图,显示三个变量(Vr、Hr 和 Ar)在具有 7 个稀释步骤的稀释系列 (x = dil) 中的平均演变。每个稀释度都有 5 个重复,我想将其总结为平均值。 这三个变量代表变量 M (Vr + Hr + Ar = M) 的比例。所以我不想将比例加起来为 100%,而是将每个变量的各个区域堆叠起来,以达到 M 的顶部(添加为一条线)。

如何在面积图中叠加三个变量的均值以显示每个稀释步骤的比例分布?到目前为止我已经尝试过了,但是这些层没有堆叠:

mline <- ggplot(data = data, aes(x = dil), na.action=na.omit) +
  stat_summary(aes(y = M, group = 1), fun = mean,
               geom ="line") +
  stat_summary(aes(y = Hr, group = 1), fun= mean,
               geom ="area", position = "stack") +
  stat_summary(aes(y = Ar, group = 1), fun= mean,
               geom ="area", position = "stack") +
  stat_summary(aes(y = Vr, group = 1), fun= mean,
               geom ="area", position = "stack")
mline

此示例的数据框如下所示:

dput(data)
structure(list(dil = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 
5L, 5L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L), .Label = c("1", 
"2", "3", "4", "5", "6", "7"), class = "factor"), M = c(0.366666667, 
12.03333333, 1, 6.933333333, 4.533333333, 2.166666667, 5.633333333, 
1, 1.4, 0, 15.66666667, 21.16666667, 6.033333333, 1, 0.2, 0, 
4.533333333, 0.333333333, 0.166666667, 0, 0, 1, 0, 0.366666667, 
0, 0.166666667, 0, 0, 0, NA, 1, 3.5, 0, NA, NA), Ar = c(0.100284295, 
3.896431897, 0.333333333, 2.241353469, 1.540488607, 0.196969697, 
2.118578371, 0.095357674, 0.200607926, 0, 3.605257275, 6.81946709, 
0.930970496, 0.393446629, 0.03012711, 0, 0.468426671, 0.031017502, 
0.065574438, 0, 0, 0.333333333, 0, 0.142139889, 0, 0.015151515, 
0, 0, 0, NA, 0.090909091, 1.240533311, 0, NA, NA), Vr = c(0.010505974, 
0.46853597, 0.333333333, 0.977669123, 0.43271556, 0.196969697, 
0.749485112, 0, 0.051063836, 0, 3.262519219, 2.859413375, 0.641593028, 
0.078689326, 0.009038133, 0, 0.637060272, 0.015508751, 0.013114888, 
0, 0, 0.333333333, 0, 0, 0, 0.015151515, 0, 0, 0, NA, 0.090909091, 
0.827022207, 0, NA, NA), Hr = c(0.255876398, 7.668365466, 0.333333333, 
3.714310741, 2.560129166, 1.772727273, 2.765269851, 0.904642326, 
1.148328239, 0, 8.798890173, 11.4877862, 4.460769809, 0.527864045, 
0.160834757, 0, 3.427846391, 0.286807081, 0.087977341, 0, 0, 
0.333333333, 0, 0.224526778, 0, 0.136363636, 0, 0, 0, NA, 0.818181818, 
1.432444482, 0, NA, NA)), row.names = c(NA, -35L), class = "data.frame")

可能很简单,但我不明白。非常感谢!

【问题讨论】:

    标签: r ggplot2 area


    【解决方案1】:

    您基本上有两种选择:(1) 以您希望的任何方式将您的摘要统计信息记录到另一个数据框中,然后使用该数据框进行绘图,或者 (2) 使用 ggplot2 中的 stat_summary 为您完成所有这些工作。我将使用选项 #2,在这种情况下更容易。

    第一步是将您的数据集转换为符合Tidy Data Principles 的数据集。看起来您有一个 y 列 (dil)、一个总列 (M) 以及三个变量 VrHrAr 的三列​​数据。在这种情况下,您可以单独保留 Mdil,但我将使用 gather() 中的 tidyr 将您的 3 列转换为 2 列:一列用于变量名称,一列用于值:

    library(ggplot2)
    library(dplyr)
    library(tidyr)
    
    # where df is your data frame
    df1 <- df %>%
      gather(key='var', value='value', -c(dil, M))
    

    然后,您可以使用stat_summary 命令进行绘图,但请注意,您应该在var 列旁边group=

    m <- ggplot(df1, aes(x=dil, group=var)) +
      stat_summary(aes(y=M), geom='line', fun=mean) +
      stat_summary(aes(y=value, fill=var), alpha=0.5,
         geom='area', position='stack', fun=mean)
    m
    

    【讨论】:

    • 非常感谢,这正是我正在寻找的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2018-10-25
    相关资源
    最近更新 更多