ggplot2在geom_errorbar中要求不存在的美学

时间:2017-02-27 17:19:48

标签: r ggplot2 tidyverse

我实际上发现答案是我的问题,但我想知道这是不是一个错误。

假设我有这个:

library(ggplot2)
library(dplyr)
first <-
mtcars %>%
  group_by(vs) %>%
  summarise(mean = mean(mpg),
            lower_ci = mean(mpg) - 2 * sd(mpg),
            upper_ci = mean(mpg) + 2 * sd(mpg))

我可以制作这样的分层情节:

ggplot(data = mtcars, aes(x = as.factor(vs))) +
  geom_point(aes(y = mpg), alpha = 0.2) +
  geom_point(data = first, aes(y = mean), colour = "red") +
  geom_errorbar(data = first, aes(ymin = lower_ci, ymax = upper_ci))

很好,没问题。让我们一步一步重建情节。

graph <- ggplot()
graph <- graph + geom_point(alpha = 0.2)
graph <- graph %+% mtcars + aes(x = as.factor(vs), y = mpg)
graph <- graph + geom_point(data = first, aes(x = as.factor(vs), y = mean, colour = "red"))

此时我只需覆盖需要xyminymax aes thethics的错误栏。但是,graph对象在对象的结构中具有预定义的y。出于某种原因,如果我添加这个:

graph + geom_errorbar(data = first,
                               aes(x = as.factor(vs), ymin = lower_ci, ymax = upper_ci))

我认为这是正确的方法,它会引发关于aes主题长度的错误。当然,first数据框具有正确的长度,因此我认为它应该从全局选项中传递y aes主题。

如果我加上这个:

graph + geom_errorbar(data = first,
                               aes(x = as.factor(vs), y = NULL, ymin = lower_ci, ymax = upper_ci))

它修复了它并按预期抛出了Warning: Ignoring unknown aesthetics: y

我认为对象的全局选项会认识到geom_errorbar并不需要y aes理论。

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:2)

  

我在这里错过了什么吗?

没有。您正确地确定了问题;你只是假设还有别的东西。这是一个可能不值得修复的小错误。

  

我认为对象的全局选项会认识到geom_errorbar并不需要美学。

默认情况下继承美学(您可以通过设置inherit.aes = FALSE来避免错误),并立即根据可用数据对其进行检查。如果继承的映射列不可用,因为它不在图层的数据框中,则会引发错误。

这是另一个例子。它与你问题中的那个没有什么不同,但是它使用了更常见的geom并且更简单一些:

df1 = data.frame(x1 = 1:2, y1 = 3:4, ty = 'a')
df2 = data.frame(x2 = 1, y2 = 5)

ggplot(df1, aes(x1, y1, linetype = ty)) +
    geom_line() + 
    geom_point(data = df2, aes(x = x2, y = y2))
# Error in eval(expr, envir, enclos) : object 'ty' not found

即使geom_point没有采用linetype美学,因为df2中没有名为ty的数据列,我们会收到错误消息。如下所示,简单的解决方法是设置inherit.aes = FALSE

ggplot(df1, aes(x1, y1, lintype = ty)) +
    geom_line() + 
    geom_point(data = df2, aes(x = x2, y = y2), inherit.aes = FALSE)
## works