添加组时,geom_bar停止工作

时间:2012-11-14 01:36:54

标签: r ggplot2

使用此数据:

library(ggplot2)
dd <- data.frame(id = c("A", "A", "B", "B"), prepost = c("pre", "post"), 
         value = 1:4)

这个有效:

qplot(id, value, data = dd, fill = prepost, geom = "bar")

但是,下一个给出指示的错误消息。两者之间的唯一区别是在命令末尾添加了group = prepost;但是,因为我们已经编写了fill = prepost,无论如何都应该是默认组。

> qplot(id, value, data = dd, fill = prepost, geom = "bar", group = prepost)
 Error in pmin(y, 0) : object 'y' not found

我们可以像这样添加stat = "identity"来修复最后一个:

qplot(id, value, data = dd, fill = prepost, geom = "bar", group = prepost, 
      stat = "identity")

我有两个问题:

(a)为什么提供错误信息的qplot在其他人工作时不起作用?

(b)如果我们对y使用连续geom_bar美学,那么如果没有指定stat,应该会发生什么?从第一个qplot开始,在这种情况下,它似乎就像stat="identity"一样,但在group指定stat="identity"的情况下,或者没有显示出差异。

(顺便说一下,这个问题似乎有些相关,虽然它的不同之处似乎没有回答这个问题:Issue with ggplot2, geom_bar, and position="dodge": stacked has correct y values, dodged does not

1 个答案:

答案 0 :(得分:1)

一个好问题!

我将回复@joran

之前的评论
  

我通常发现,一旦他们学会停止使用qplot

,人们就不会对ggplot感到困惑

您可以使用

重新创建qplot来电
ggplot(dd) + geom_bar(aes(x = id, y = value, fill = prepost))

现在,如果您阅读了geom_bar的帮助,它会列出它理解的美学,group不是其中之一(所以也许您不能指望它可以按照您的意愿工作此)

如果您阅读了group的帮助,您会发现它是一种审美,它允许您覆盖所有离散变量的默认交互。

如果仅按prepost进行分组,则不会按离散的​​x轴变量id进行分组,默认情况下也会包含该变量,

因此

ggplot(dd) + 
 geom_bar(aes(x=id, y = value, fill = prepost, group = interaction(id, prepost)))

有效,但分组完全是多余的,因为这是默认值。

如果仅指定prepostid作为分组,则会混淆stat_bin(基础方法正在处理数字以创建条形图的值。因此,您需要改为使用stat_identity


编辑:正如OP在下面的评论中所指出的,这与known issue有关,并且会在下一个版本中提供更好的警告(或者在github上的当前开发版本

来自新闻

  
      
  • stat_bin现在会在设置或使用时生成警告消息   映射y值。以前,可以使用stat_bin和。{   还设置/映射y值;如果每组有一个y值,它会   显示数据中的y值,而不是显示的案例数   每组。此用法已弃用,将来会被删除   ggplot2的版本。 (Winston Chang。修复#632)
  •