Эстетика должна быть либо длиной 1, либо такой же, как проблема с данными - ggplot.

Я пытаюсь построить линейный график в ggplot. Но я получаю эту ошибку:

Aesthetics must be either length 1 or the same as the data (9): y, x, group 

Этот график состоит из 4 линий. У меня есть еще один график, который использует тот же фрейм данных, но разные два столбца. Я не понимаю, почему этот график работает правильно, а этот график - нет. Я перепробовал все возможные ответы, которые нашел, но ничего не работает. Другой график построен с использованием expkm и actualkm с датами на оси x.

pred <- ggplot(data_, aes(x= data_$dates, group=1)) +
    geom_point(aes(y = data_$exp))+
    geom_point(aes(y = data_$facc))+
    geom_point(aes(y = data_$cntrmlg))+
    geom_point(aes(y = data_$top10rem))+
    geom_line(aes(y = data_$exp, color='Expected')) + 
    geom_line(aes(y = data_$facc, color='Actual'))+
    geom_line(aes(y = data_$cntrmlg, color='status'))+
    geom_line(aes(y = data_$top10rem, color='Statusy'))+
    geom_label(aes(y = data_$exp,label = data_$exp,hjust = 0,vjust = -0.2))+
    geom_label(aes(y = data_$facc,label = data_$facc,hjust = 0,vjust = 0.2 ))+
    geom_label(aes(y = data_$cntrmlg,label = data_$cntrmlg,hjust = 0,vjust = -0.2))+
    geom_label(aes(y = data_$top10rem,label = data_$top10rem,hjust = 0,vjust = 0.2 ))+
    labs(title = "Reli")+
    labs(x="Dates")+
    labs(y="")+
    guides(color = guide_legend(title = ""))

Образец данных :

     expkm
    50000
    100000
    112500
    137500
    150000
    162500
    187500
    187500
    187500

   actualkm dates  exp      facc        cntrmlg     top10rem
    26013   Dec-17  32660   26013       50000       26013
    56796   Jan-18  46188   13802       75000       41405
    52689   Feb-18  56569   19357       87500       45166
    64657   Mar-18  65320   25019       100000      50039
    79445   Apr-18  73030   21508       91667       46600
    92647   May-18  80000   19592       101786      53178
    121944  Jun-18  86410   16473       75000       41183
    125909  Jul-18  92376   15900       77679       44293
    106470  Aug-18  97980   15795       67105       38241

Я бы рекомендовал сделать шаг назад, чтобы сначала пройти несколько руководств по ggplot2. В ggplot есть 2 основных шаблона, которые отсутствуют в вашем коде: присвоение переменных эстетике, например цвету, и тот факт, что вы обращаетесь к столбцам вашего фрейма данных во всех ваших geom_* и других функциях. Из-за этого вам не нужен $, и вы фактически вызовете проблемы, сделав это.

camille 31.10.2018 14:46

В теге r-faq, в том числе Вот этот, есть несколько примеров преобразования данных, чтобы преобразовать их в длинный формат, который соответствует парадигме «грамматики графики» ggplot. Я бы порекомендовал главы Tidy Data и Data Visualization бесплатного R для книги Data Science

camille 31.10.2018 14:49
2
2
8 547
1

Ответы 1

С ggplot вам нужно использовать другой подход для правильного построения графика.

Обратитесь к это, чтобы лучше понять grammar. Здесь еще один полезный гайд.

Вам не нужно вызывать каждую новую строку, вместо этого вы вызываете ее один раз и указываете группировку по эстетике color.

Обратите внимание в моем коде на использование gather, чтобы получить данные в длинном формате:

library(ggplot2)
library(tidyr) # for the gather function
data %>% 
  gather("key", "value", -dates) %>% 
  ggplot(aes(x = dates, y = value, color = key)) +
  geom_line()

enter image description here

Вот полный код, следующий за вашим примером:

data %>% 
  gather("key", "value", -dates) %>% 
  ggplot(aes(x = dates, y = value, color = key)) +
  geom_line() +
  geom_point() +
  geom_label(aes(y = value, label=key), hjust = 0, vjust = -0.2) +
  labs(title = "Reli")+
  labs(x="Dates")+
  labs(y="")+
  guides(color = guide_legend(title = ""))

enter image description here

Использованные данные:

tt <- "expkm actualkm dates  exp      facc        cntrmlg     top10rem
50000 26013   Dec-17  32660   26013       50000       26013
100000 56796   Jan-18  46188   13802       75000       41405
112500 52689   Feb-18  56569   19357       87500       45166
137500 64657   Mar-18  65320   25019       100000      50039
150000 79445   Apr-18  73030   21508       91667       46600
162500 92647   May-18  80000   19592       101786      53178
187500 121944  Jun-18  86410   16473       75000       41183
187500 125909  Jul-18  92376   15900       77679       44293
187500 106470  Aug-18  97980   15795       67105       38241"

data <- read.table(text=tt, header = T, stringsAsFactors = F)
data$dates <- lubridate::parse_date_time(data$dates, "my") # correct date format

data или data_ ?? Я получаю сообщение об ошибке, не могу найти функцию "собрать", я добавил библиотеку dplyr

qwww 31.10.2018 13:05

gather () находится в библиотеке (tidyverse) и библиотеке (tidyr). [В RStudio вы можете ввести имя функции, навести курсор на имя и нажать F1 для поиска соответствующей библиотеки.]

M.Viking 31.10.2018 13:10

извините за это, исправлено. А это data.

RLave 31.10.2018 13:39

Отличный ответ. Как правило, когда вы добавляете множество дополнительных геометрий для отказоустойчивого простого графа, вам, вероятно, нужно сделать больше в aes() фактического вызова ggplot или настроить базовые данные.

Ben G 31.10.2018 13:50

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