寻找帮助解决ggplot2中的geom_text()错误

时间:2011-05-27 03:07:57

标签: r ggplot2

我发现了我认为ggplot2使用geom_text的一个错误,我想知道是否有人在办公室/能够指出我做错了什么。

请考虑以下示例代码:

library(ggplot2)

Treatment <- rep(c('C','T'),3)
Group <- rep(c('A','B','C'),each=2)
Response <- c(0.22894321, 0.23391813, 0.92256514, 0.92705167, 0.05982670, 0.09667674)
Differences <- c('+0pts',  '+0pts', '+0pts', '+0pts', '+4pts', '+4pts')

df <- data.frame(Treatment, Group, Response, Differences)

ydef <- c(0.03, 0.03, 0.2)

hist <- ggplot(df, aes(x=Group, y=Response, fill=Treatment, stat="identity"))
hist + geom_bar(position = "dodge")  + geom_text(aes(label = Differences,y=ydef))

如果这对你有用,就像它对我一样 - 使用最新版本的ggplot2和R 2.12.2 - 组B和C应该有两个文本浮点数,间隔相等的距离。显然这不是我们想要的。现在更改'ydef'以便

ydef <- c(0.03, 0.03, 0.03)

重新运行上面的脚本,问题就解决了 - 每个组现在只有一个对应于差异的文本浮点数(或者更确切地说是两个,完全相互叠加)。这有什么用呢?我一直在相当大规模的应用程序中使用这个基本结构,并且在我使用这些特定数字得到这个特定示例之前没有遇到任何麻烦。

问题的一部分可能是我构建“差异”的方式,方法是将其作为列添加到数据框并使用geom_text将此文本放在图表上。如果有一种方法可以使用只有三个字符条目的向量来做同样的事情我肯定会解决问题。

简而言之(1)请帮忙! (2)这是一个考虑ggplot2社区的潜在有趣的bug。

干杯, 亚伦

1 个答案:

答案 0 :(得分:2)

我认为这不是一个错误,我认为你没有正确使用aes()。在aes()中设置的美学应该引用数据框中的变量。您的数据框(这里有些人可能会因为命名'df'而责备您),其中没有名为ydef的变量。如果将它添加到数据框中,它对我来说就可以了:

df$ydef <- rep(ydef,each=2)

请注意,需要根据Group的级别重复这些值。

如果您要将美学设置为传递给geom的数据框中未包含的单个值,那么它应该只是一个值,它应该在aes()调用之外发生。

编辑:为了解释你所看到的行为,你要将长度为3的向量传递给ggplot,然后尝试将其与6行的数据帧进行协调。所以R回收矢量,导致这种情况:

A 0.03
A 0.03
B 0.2
B 0.03
C 0.03
C 0.2

所以现在你有两个级别,它们有两个不同的值。