Ошибка: Столбцы `y`, `colour` должны быть 1d атомными векторами или списками`. У меня нет колонки "цвет"
Я пытаюсь создать простой ggplot с 3 geom_line
s, чтобы показать нормальные, 5 и 10-летние скользящие средние. Мой фрейм данных temp
с колонкой AverageTemperature
, Однако я не могу понять следующие ошибки:
Error: Columns 'y', 'colour' must be 1d atomic vectors or lists
,
Error: 'mapping' must be created by 'aes()'
У меня нет столбца с именем у или цвета и все мои сопоставления. Другие ответы не объясняют причину ошибок. Мой код выглядит следующим образом:
library(ggplot2)
library(forecast)
ma <- ma(temp$AverageTemperature, order = 5)
ma2 <- ma(temp$AverageTemperature, order = 10)
ggplot(temp, x= dt) +
geom_line(temp, aes(y = AverageTemperature, size = 1.5)) + scale_y_log10() + xlim(1870, 2000) +
geom_line(temp, aes(y = ma, color = ma, size = 1.5)) +
geom_line(temp, aes(y = ma2, color = ma, size = 1.5)) `
Мой требуемый результат будет выглядеть следующим образом:
Пример данных с использованием dput
:
structure(list(dt = c(1743L, 1744L, 1745L, 1750L, 1751L, 1752L ), AverageTemperatureUncertainty = c(3.1304125, 3.0976671875, 3.00175, 3.13747272727273, 3.09229285714285, 3.06561458333333 )), row.names = c(NA, 6L), class = "data.frame")
Может кто-нибудь объяснить, в чем ошибки, пожалуйста?
Большое спасибо.
1 ответ
Ошибки, которые вы получаете, в основном связаны с тем, что внутри и снаружи aes
скобки. Они должны содержать все и только значения, которые варьируются для каждой точки данных:
Columns 'y', 'colour'
относится к вашемуy = ma
а такжеy = ma2
части (иcolor =
биты, которые следуют). В ваших звонках выше он смотрит внутри фрейма данныхtemp
как определено в первомggplot
скобка и не может найти эти переменные.- Вы не хотите, чтобы цвет менялся в зависимости от даты, поэтому в каждом
geom_line
позвони, возьми это изaes()
скобка и установите его как постоянный цвет. size = 1.5
также постоянна по переменным в каждомgeom_line
звоните, так должно быть за пределамиaes()
,'mapping' must be created by 'aes()'
относится, вероятно, к вашимx = dt
участие вggplot
скобка (это должно быть вaes()
скобка) и вызовtemp
в каждом последующемgeom_line
скобка.
Было бы проще и аккуратнее рассчитать скользящие средние и объединить их в исходный кадр данных:
library(dyplr)
library(ggplot2)
set.seed(1421)
ma <- function(x,order=5){stats::filter(x,rep(1/order,order), sides=2)}
temp<-tibble(AverageTemperature=rnorm(131, 10, 3), dt=seq(1870,2000))
ma1 <- ma(temp$AverageTemperature, order = 5)
ma2 <- ma(temp$AverageTemperature, order = 10)
temp$ma1 <- ma1
temp$ma2 <- ma2
ggplot(temp, aes(x = dt)) +
geom_line(aes(y = AverageTemperature), color="orange", size = 1.5) + scale_y_log10() + xlim(1870, 2000) +
geom_line(aes(y = ma1), color = "red", size = 1.5) +
geom_line(aes(y = ma2), color = "blue", size = 1.5)
Предоставление графика (из случайно сгенерированных значений):
(Я создал ma
как новая функция)
Это помогает? Вам нужно будет поиграть с цветами и т.д., чтобы удовлетворить.
Изменить: на самом деле видя код Нельсона выше, который удобнее для добавления в легенду. Вместо последнего ggplot
Команда в моем коде выше вы могли бы вместо этого сделать:
temp %>% gather("id","value",c(1,3,4)) %>%
ggplot(aes(dt,value,col=id))+
geom_line(size=1.5)+scale_y_log10() +
xlim(1870, 2000)