"Эстетика должна быть длиной 1" с разными аргументами x, y и цвета.

У меня есть проблема, которую довольно просто исправить, но я не нашел ответов, которые непосредственно применимы к моей ситуации.

Я пытаюсь создать график с 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, либо такой же, как data (3): x"

Любая помощь будет принята с благодарностью.

1 ответ

Решение

Проблема в том, что вы не делаете 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")

Другие вопросы по тегам