"Aesthetics must be either length 1" 具有不同的 x、y 和颜色参数

"Aesthetics must be either length 1" with different x, y and colour arguments

我有一个应该很容易解决的问题,但我还没有找到任何直接适用于我的情况的答案。

我正在尝试使用 geom_point 创建一个绘图,其中显示的点是字符向量的过滤值。 y 是连续数字,x 是日期,fill 是字符向量。

这是我的示例数据:

year    month   day attempt n_test
2019    6   22  1   NA
2019    7   13  2   n
2019    8   3   3   n
2019    8   20  4   n
2019    9   3   5   n
2019    9   4   6   n
2019    9   8   7   n
2019    9   11  8   p
2019    9   17  9   n
2019    10  3   10  n
2019    10  3   11  n
2019    10  11  12  c
2019    10  22  13  n
2019    10  25  14  n
2019    10  28  15  p
2019    11  6   16  c
2019    11  9   17  n
2019    11  25  18  n
2019    12  4   19  n
2019    12  8   20  n
2019    12  14  21  p
2019    12  17  22  n
2019    12  20  23  n

这叫做'ntest.csv'。

这是我的代码:

ntest <- read.csv('ntest.csv', header = TRUE)
n_date <- ymd(paste(ntest$year, ntest$month, ntest$day, sep="-"))
ggplot(ntest, aes(n_date, y=attempt)) +
    geom_point(aes(colour = n_test), size = 3.5) +
    labs(x=NULL) +
    theme(legend.position="none",
          axis.text.x = element_text(color = "black", size = 10, angle=45),
          axis.text.y = element_text(color = "black", size = 10),
          axis.title.y = element_text(size = 13, vjust = 2)) +
    scale_x_date(date_breaks = "months" , date_labels = "%b-%y")

这给出了附图。

ntestplot

我只想显示 geom_point 图表中 n_test 等于“p”的行。 所以同一张图,只有蓝点。 我试过使用

ntest %>% 
filter(n_test=="p")

在 ggplot 之前,但这导致:

“错误:美学必须是长度1或与数据(3)相同:x”

如有任何帮助,我们将不胜感激。

这里的问题是你没有让 n_date 成为数据框的一部分,所以当你过滤数据框时它没有被过滤,因此与它的长度不同。解决方案只是将其创建为数据框中的一列:

ntest$n_date <- lubridate::ymd(paste(ntest$year, ntest$month, ntest$day, sep="-"))

现在你可以应用你的过滤器,你的图就可以工作了(注意点是红色的,因为现在只有一个颜色组):

ggplot(ntest %>% filter(n_test == "p"), aes(n_date, y=attempt)) +
    geom_point(aes(colour = n_test), size = 3.5) +
    labs(x=NULL) +
    theme(legend.position="none",
          axis.text.x = element_text(color = "black", size = 10, angle=45),
          axis.text.y = element_text(color = "black", size = 10),
          axis.title.y = element_text(size = 13, vjust = 2)) +
    scale_x_date(date_breaks = "months" , date_labels = "%b-%y")