【问题标题】:How to apply stat_sum to a particular grouping如何将 stat_sum 应用于特定分组
【发布时间】:2013-03-08 07:50:30
【问题描述】:

我有以下代码可以生成以下图表。

colvec <-c("white", "white","gray85", "gray85", "gray58", "gray58", "gray33", "gray33","black", "black") 

ggplot(nut, aes(Date, Nitrate, group=Wetland, shape=Hydrology)) +
  geom_point(aes(fill=Wetland), colour="black", size=4)+
  scale_fill_manual(values=colvec) +
  scale_shape_manual(values=c(21,22))+
  facet_grid(. ~ Hydrology) +
  ylab ("Nitrate (mg/L) ") +
  theme(legend.position="none",
        panel.background = element_rect(fill='white', colour='white'), 
        panel.grid = element_line(color = NA),
        panel.grid.minor = element_line(color = NA),
        panel.border = element_rect(fill = NA, color = "black"),
        axis.text.x  = element_text(size=10, colour="black"),  
        axis.title.x = element_text(vjust=0.1),
        axis.text.y = element_text(size=12, colour="black"),
        axis.title.y = element_text(vjust=0.3))

我不知道如何使用stat_sum 以使每个日期的 5 个点平均在一起。该程序将每个不同的阴影点(对应于湿地)视为其自己的平均值。我想保留湿地分组并将其显示为不同的阴影,但也显示每个日期所有 y 值的平均值。

数据

枣湿地水文硝酸盐 1 6 月 17 日一脉冲 0.2647287 2 7 月 18 日一脉冲 0.1807388 3 8 月 1 日脉冲 0.9895910 4 8 月 15 日一脉冲 0.6566667 5 11 月 7 日 1 脉冲 0.2150000 6 17-6月 2静态 0.2134027 7 7 月 18 日两个静态 0.1971669 8 1-8 月 2 日静态 0.4774424 9 8 月 15 日两个静态 0.3110000 10 11 月 7 日两个静态 0.3333333 11 6 月 17 日 三脉冲 0.3369253 12 7 月 18 日 三脉冲 0.2056284 13 8 月 1 日 三 脉冲 0.6731924 14 8 月 15 日三脉冲 0.5516667 15 11 月 7 日 三脉冲 0.1853333 16 17-6月 四静 0.3293668 17 7 月 18 日 四静 0.4664748 18 8 月 4 日 静态 0.4555003 19 8 月 15 日四 静态 0.3993333 20 11 月 7 日 4 静态 0.1133333 21 6月17日 五静 0.3497963 22 7月18日 五静 0.3618659 23 8 月 5 日 0.3721719 静态 24 8 月 15 日五 静态 0.2916667 25 11 月 7 日 5 静态 0.2526667 26 6 月 17 日 6 脉冲 0.2779667 27 7 月 18 日 六脉冲 0.7609531 28 8 月 6 日 0.7177083 脉冲 29 6 月 15 日 6 脉冲 0.6610000 30 11 月 7 日 六脉冲 0.2083333 31 6 月 17 日七脉冲 0.2232040 32 7 月 18 日 七脉冲 0.3655621 33 7 月 1 日 脉冲 0.7006131 34 7 月 15 日 脉冲 0.4753333 35 11 月 7 日七脉冲 0.3206667 36 17-6月8日 静 0.3339319 37 7 月 18 日 8 静态 0.3286641 38 8 月 1 日 静态 0.4390918 39 八月 15 日 静态 0.3276667 40 11 月 7 日 8 日静态 0.2446667 41 17-6月 九静 0.3456627 42 7 月 18 日 九静 0.2519814 43 8 月 9 日 1 日静态 0.3807550 44 8 月 15 日 9 日静态 0.3873333 45 11 月 7 日九静态 0.1663333 46 6 月 17 日至 10 日脉冲 0.4135023 47 7 月 18 日 10 次脉冲 0.1921382 48 8 月 1 日至 10 日脉冲 0.3898374 49 8 月 15 日至 10 日脉冲 0.2700000 50 11 月 7 日至 10 日脉冲 0.1216667

输入(螺母)

结构(列表(日期=结构(c(3L,4L,1L,2L,5L,3L,4L, 1L, 2L, 5L, 3L, 4L, 1L, 2L, 5L, 3L, 4L, 1L, 2L, 5L, 3L, 4L, 1L, 2L, 5L, 3L, 4L, 1L, 2L, 5L, 3L, 4L, 1L, 2L, 5L, 3L, 4L, 1L, 2L, 5L, 3L, 4L, 1L, 2L, 5L, 3L, 4L, 1L, 2L, 5L), .Label = c("1-Aug", “8 月 15 日”、“6 月 17 日”、“7 月 18 日”、“11 月 7 日”)、class= “因子”)、湿地 = 结构(c(5L, 5L, 5L, 5L, 5L, 10L, 10L, 10L, 10L, 10L, 9L, 9L, 9L, 9L, 9L, 3L,3L,3L,3L,3L,2L,2L,2L,2L,2L,7L,7L,7L,7L,7L,6L, 6L, 6L, 6L, 6L, 1L, 1L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 4L, 8L, 8L, 8L, 8L, 8L), .Label = c("八", "五", "四", "九", "一", “七”,“六”,“十”,“三”,“二”),class=“因子”),水文=结构(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L), .Label = c("脉冲", "静态"), class= "因子"), 硝酸盐 = c(0.264728748, 0.180738787, 0.989591021, 0.656666667, 0.215, 0.213402705, 0.197166881, 0.477442378, 0.311, 0.333333333, 0.33692531, 0.205628403, 0.67319236, 0.551666667, 0.185333333, 0.329366831, 0.466474791, 0.455500298, 0.399333333, 0.113333333, 0.349796312, 0.361865927, 0.372171941, 0.291666667, 0.252666667, 0.277966745, 0.760953065, 0.717708344, 0.661, 0.208333333, 0.223203974, 0.365562124, 0.700613059, 0.475333333, 0.320666667、0.333931889、0.328664129、0.439091764、0.327666667、 0.244666667, 0.345662714, 0.251981433, 0.380755049, 0.387333333, 0.166333333、0.413502261、0.192138209、0.389837374、0.27、0.121666667 )), .Names = c("日期", "湿地", "水文", "硝酸盐"), class= "data.frame", row.names = c(NA, -50L))

【问题讨论】:

  • 除非你给我们一个我们可以完全自己运行的例子,否则你不会得到很好的答案(或可能任何答案)。

标签: r ggplot2


【解决方案1】:

如果没有您的数据,这有点难以回答(因为我通常会先测试它!),但我认为您可以通过日期和水文aggregate 您的硝酸盐数据并计算平均值,然后使用额外的 @987654323 绘图@与不同的data.frame

这行得通吗...

nutm <- aggregate( Nitrate ~ Date + Hydrology , data = nut , FUN = mean )

p <-ggplot(nut, aes(Date, Nitrate, shape = Hydrology)) +
  geom_point( data = nut , aes( fill = Wetland , group=Wetland ), colour="black", size=4)+
  scale_fill_manual(values=colvec) +
  scale_shape_manual(values=c(21,22))+
  facet_grid(. ~ Hydrology) +
  ylab ("Nitrate (mg/L) ") +
  geom_point( data = nutm , aes( x = Date , y = Nitrate) , color = "red" , fill = "red" , size = 4 ) +
  theme(legend.position="none",
        panel.background = element_rect(fill='white', colour='white'), 
        panel.grid = element_line(color = NA),
        panel.grid.minor = element_line(color = NA),
        panel.border = element_rect(fill = NA, color = "black"),
        axis.text.x  = element_text(size=10, colour="black"),  
        axis.title.x = element_text(vjust=0.1),
        axis.text.y = element_text(size=12, colour="black"),
        axis.title.y = element_text(vjust=0.3))

p

这给了我你的图表,每个日期都有一个红色的平均标记......

【讨论】:

  • 我收到一个错误“geom_point 错误(aes(fill = Wetland), color = "black", size = 4) + : non-numeric argument to binary operator”。我只是把数据放上来。
  • 使用dput( nut ) 粘贴数据,然后我们可以将其输出复制并粘贴到R中。
  • @user2055130 好的,现在可以了吗?我不得不从 ggplot 调用中删除分组元素并将其放在 geom_point 中,因为它不被第二个 geom_point 层共享。请注意,通过这种方式,您将无法将颜色、填充和形状等美学映射到第二层,只能设置它们。可能有一种更 ggplot 的方式来做到这一点,但我希望这应该让你开始。请问dputcolvec的内容也可以吗?
  • 好的,colvec 只需要像colvec &lt;-c("white", "gray85", "gray58", "gray33", "black", "white", "gray85", "gray58", "gray33", "black") 这样安排,然后重新排序日期因子。然后就完美了。谢谢!
  • 相反,您可以使用函数grey 来制作您的colvec 并确保它像这样均匀分布...colvec &lt;- grey( seq( 0 , 1 , length.out = 10 ) ) whcih 给出[1] "#000000" "#1C1C1C" "#393939" "#555555" "#717171" "#8E8E8E" "#AAAAAA" "#C6C6C6" "#E3E3E3" [10] "#FFFFFF"
猜你喜欢
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 2023-02-11
相关资源
最近更新 更多