【问题标题】:using geom_bar to plot the sum of values by criteria in R使用 geom_bar 按 R 中的标准绘制值的总和
【发布时间】:2017-06-29 04:15:26
【问题描述】:

我是 R 新手,我正在尝试使用 ggplot 来为每个 id 创建条形图的子集。每个条形必须按月-年(即 c 列)表示 d 列中值的总和。 d 也有 NA 值和数值。

我的数据框 df 是这样的,但它实际上有大约 10000 行:

#Example of my data
a=c(1,1,1,1,1,1,1,1,3)
b=c("2007-12-03", "2007-12-10", "2007-12-17", "2007-12-24", "2008-01-07", "2008-01-14", "2008-01-21", "2008-01-28","2008-02-04")
c=c(format(b,"%m-%Y")[1:9])
d=c(NA,NA,NA,NA,NA,4.80, 0.00, 5.04, 3.84)
df=data.frame(a,b,c,d)
df

  a          b       c    d
1 1 2007-12-03 12-2007   NA
2 1 2007-12-10 12-2007   NA
3 1 2007-12-17 12-2007   NA
4 1 2007-12-24 12-2007   NA
5 1 2008-01-07 01-2008   NA
6 1 2008-01-14 01-2008 4.80
7 1 2008-01-21 01-2008 0.00
8 1 2008-01-28 01-2008 5.04
9 3 2008-02-04 02-2008 3.84

我试着用这个来做我的图表:

mplot<-ggplot(df,aes(y=d,x=c))+
       geom_bar()+
       theme(axis.text.x = element_text(angle=90, vjust=0.5))+
       facet_wrap(~ a)

我在 geom_bar() 的帮助下阅读:

“geom_bar默认使用stat_count:统计每个x位置的case个数”

所以,我认为它会像我遇到这个错误一样工作:

Error: stat_count() must not be used with a y aesthetic.

对于我提供的示例,我希望 id 1 的图表显示 NA 为空的月份和 9.84 的 01-2008 月份。然后对于第二个 id,我想再次拥​​有 NA 为空的月份和 02-2008 的 3.84 月份。

我还尝试通过使用聚合和 sum before 来绘制每个月的数据,然后在 geom_bar 的 stat 参数中使用 identity,但是,我在几个月后得到 NA,我不知道原因。

非常感谢您的帮助。

【问题讨论】:

  • 您能否提供一些数据,如here 所述?最终的图表应该是什么样子?您希望它有一个 01-2008 年的条形图,高度为 9.84,第二个条形图为 02-2008 年的 3.84(基于样本数据)?
  • 正是@Jan。我只是用预期的结果编辑帖子
  • 像这样:ggplot(df, aes(y=d, x=c)) + geom_col() + theme(axis.text.x = element_text(angle=90, vjust=0.5))+facet_wrap(~ a)
  • 谢谢@Jan。有效!我现在的问题是我不知道为什么。根据帮助,如果我想计数,我使用 geom_bar,如果我想使用数据中的值,我使用 geom_col。那么,你知道它为什么起作用吗?另外,我在 x 轴上添加了重新排序,因为我得到 01-2007、01-2008、02-2007,... 而不是 01-2007, 02-2007,... 到目前为止,我的代码看起来像:mplot&lt;-ggplot(e, aes(y=d,x=reorder(format(as.Date(e$b),'%m-%Y'),e$b)))+ geom_col()+ theme(axis.text.x = element_text(angle=90, vjust=0.5))+ xlab("Months")+ facet_wrap(~ a)
  • 我发布了一些答案,如果您能接受它作为答案,那就太好了。对于您的问题“您知道它为什么起作用吗”,我不确定您想知道什么。它起作用是因为您现在按预期使用它;)

标签: r ggplot2


【解决方案1】:

您应该使用 geom_col 而不是 geom_bar。查看帮助文本:

有两种类型的条形图:geom_bar 使条形的高度与每组中的案例数成正比(或者如果提供了权重美学,则为权重的总和)。如果您希望条形的高度表示数据中的值,请改用 geom_col。 geom_bar 默认使用 stat_count:它计算每个 x 位置的案例数。 geom_col 使用 stat_identity:它使数据保持原样。

所以你的最后一行代码应该是:

ggplot(df, aes(y=d, x=c)) + geom_col() + theme(axis.text.x = element_text(angle=90, vjust=0.5))+facet_wrap(~ a)

【讨论】:

    【解决方案2】:

    你想要这样的东西吗:

    mplot = ggplot(df, aes(x = b, y = d))+
      geom_bar(stat = "identity", position = "dodge")+
      facet_wrap(~ a)
    
    mplot
    

    我现在使用x = b 而不是x = c

    【讨论】:

    • 我只是用预期的结果编辑我的帖子,这不是我所期望的
    【解决方案3】:

    不需要像@Jan 建议的那样使用geom_col。只需使用 weight 美学代替:

    ggplot(iris, aes(Species, weight=Sepal.Width)) + geom_bar() + ggtitle("summed sepal width")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-28
      • 2015-07-22
      • 2011-08-09
      • 2014-11-17
      • 2019-02-19
      相关资源
      最近更新 更多