2

使用这些数据:

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"与否的存在下揭示了差异。

(顺便说一句,这个问题似乎有些相关,尽管它的不同之处在于它似乎无法回答这个问题:ggplot2、geom_bar 和 position="dodge" 的问题:stacked has correct y values, dodged does not

4

1 回答 1

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 在下面的评论中所指出的,这与一个已知问题有关,并将在下一个版本(或 github 上的当前开发版本)中给出更好的警告

从新闻

  • stat_bin现在,当它与设置或映射的 y 值一起使用时会产生警告消息。以前,可以使用stat_bin和设置/映射 y 值;如果每组有一个 y 值,它将显示数据中的 y 值,而不是每组的病例数。这种用法已被弃用,并将在 ggplot2 的未来版本中删除。(温斯顿张。修复 #632)
于 2012-11-14T02:13:07.363 回答