Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ggplot2要求geom_errorbar中不存在的美学_R_Ggplot2_Tidyverse - Fatal编程技术网

ggplot2要求geom_errorbar中不存在的美学

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)) 很好,没问

事实上,我发现答案是我的问题,但我想知道这是否是一个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))
很好,没问题。让我们一步一步地重新创建绘图

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