【问题标题】:Looking for help resolving a geom_text() bug in ggplot2寻求帮助解决 ggplot2 中的 geom_text() 错误
【发布时间】:2011-05-27 03:07:57
【问题描述】:

我发现了我认为 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 社区考虑。

干杯, 亚伦

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

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

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

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

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

    编辑:为了解释您所看到的行为,您将长度为 3 的向量传递给 ggplot,然后它会尝试将其与具有 6 行的数据框进行协调。于是R回收了vector,导致了这种情况:

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

    所以现在您有两个级别,其中有两个不同的值与之关联。

    【讨论】:

    • 绝对不是bug。 Aaron 为 6 传递了 3 个值,因此明显重复。
    • 对!只是为了好玩,我会编辑以反映(一些)细节。
    • 谢谢,Joran - 这是一个更成功的修复。