使用此数据:
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)
答案 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)))
有效,但分组完全是多余的,因为这是默认值。
如果仅指定prepost
或id
作为分组,则会混淆stat_bin
(基础方法正在处理数字以创建条形图的值。因此,您需要改为使用stat_identity
。
来自新闻
stat_bin
现在会在设置或使用时生成警告消息 映射y值。以前,可以使用stat_bin
和。{ 还设置/映射y值;如果每组有一个y值,它会 显示数据中的y值,而不是显示的案例数 每组。此用法已弃用,将来会被删除 ggplot2的版本。 (Winston Chang。修复#632)