我实际上发现答案是我的问题,但我想知道这是不是一个错误。
假设我有这个:
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"))
此时我只需覆盖需要x
,ymin
和ymax
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
理论。
我在这里错过了什么吗?
答案 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