Ошибка: Столбцы `y`,` colour` должны быть 1d атомными векторами или списками`. У меня нет колонки "цвет" - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь создать простой 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()'

У меня нет столбца с именем y или цветом, и все мои сопоставления. Другие ответы не объясняют причину ошибок. Мой код выглядит следующим образом:

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)) `

Мой требуемый результат будет выглядеть следующим образом:

https://www.datascience.com/hs-fs/hubfs/learn-data-science-forecasting-with-ARIMA-chart-3.png?width=1900&height=713&name=learn-data-science-forecasting-with-ARIMA-chart-3.png

Пример данных с использованием 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 Ответ

0 голосов
/ 14 января 2019

Ошибки, которые вы получаете, в основном связаны с тем, что находится внутри и вне скобок 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)

Предоставление графика (из случайно сгенерированных значений):

sample graph

(я создал 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...