ggplot2要求geom_errorbar中不存在的美学
事实上,我发现答案是我的问题,但我想知道这是否是一个bug 假设我有这个:ggplot2要求geom_errorbar中不存在的美学,r,ggplot2,tidyverse,R,Ggplot2,Tidyverse,事实上,我发现答案是我的问题,但我想知道这是否是一个bug 假设我有这个: 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)) 很好,没问
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))
很好,没问题。让我们一步一步地重新创建绘图
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"))
我认为这是正确的方法,它抛出了一个关于aes
thetic长度的错误。当然,第一个
数据帧的长度是正确的,因此我认为它应该传递全局选项中的y
aes
thetic
如果我加上:
graph + geom_errorbar(data = first,
aes(x = as.factor(vs), ymin = lower_ci, ymax = upper_ci))
graph + geom_errorbar(data = first,
aes(x = as.factor(vs), y = NULL, ymin = lower_ci, ymax = upper_ci))
它修复了它,并按预期抛出警告:忽略未知美学:y
我假设对象的全局选项将识别geom_errorbar
不需要y
aes
thetic
我是不是遗漏了什么
我是不是遗漏了什么
否。您正确识别了问题;你只是假设还有别的东西。这是一个可能不值得修复的小错误
我假设对象的全局选项将识别出geom\u errorbar
不需要y美学
默认情况下会继承美学(您可以通过设置inherit.aes=FALSE
)来避免错误),并且会立即根据可用数据检查美学。如果继承的映射列不可用,因为它不在层的数据帧中,则会引发错误
这是另一个例子。它与您问题中的没有什么不同,但它使用了更常见的geom
s,并且更简单:
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
不采用线型
美观,但由于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
在您的代码和@cimentadaj的代码中,您在第二个aes()中指定了一个新的数据源。因此,geom_uu中的引用指向新的数据集。假设在两个单独的数据帧中匹配变量名表示相同的变量,这似乎是一个问题的解决办法。我不认为默认不做那个假设是一个错误。我不确定我是否明白你的意思。我使用的数据与问题中的数据类似——两个数据框,共享列名表示相同的变量。如果在不同的数据帧中有相同的变量(OP似乎是这样),我认为使用相同的列名可能是个好主意。如果您想在
ggplot2
中讨论设计决策,我认为这不是您要找的论坛。从软件的角度来看,实现对我来说是有意义的,因为每个层都知道要查看哪些数据,但不需要担心其他层正在查看哪些数据。点图层不应根据线图层是否引用同一数据帧而改变行为。
ggplot(df1, aes(x1, y1, lintype = ty)) +
geom_line() +
geom_point(data = df2, aes(x = x2, y = y2), inherit.aes = FALSE)
## works