Сортировка меток осей фреймов данных в ggplot

#r #dataframe #sorting #ggplot2

#r #фрейм данных #сортировка #ggplot2

Вопрос:

У меня есть фрейм данных (df) в простой форме, который выглядит следующим образом:

 year month place Value 1 2017 11 A 8 2 2017 11 B 14 3 2017 11 C 17 4 2017 12 A 55 5 2017 12 B 12 6 2017 12 C 69 7 2018 11 A 42 8 2018 11 B 25 9 2018 11 C 21 10 2018 12 A 26 11 2018 12 B 81 12 2018 12 C 14  

Я пытаюсь построить несколько графиков для каждого A, B и C, чтобы наблюдать изменения за месяц по сравнению с предыдущим месяцем

 library(zoo) library(ggplot2) df$time lt;- as.yearmon(paste(df$Year,df$month), "%Y %m") ggplot(df, aes(x=as.character(time), y= Value, color= as.factor(place)))   geom_point() geom_line(aes(group=1))  facet_grid(place~., scales = "free_y")  

Но это не работает. Несмотря на то, что ось x отсортирована во фрейме данных, она искажается, поскольку ось x помечается как ноябрь 2017 года, затем ноябрь 2018 года вместо ноября 2017 года, затем декабрь 2017 года. Что я здесь делаю не так?

Ответ №1:

Обновление см. Комментарии OP:

 library(ggplot2) df %gt;%   mutate(time = as.Date(paste(year, month,"01", sep = "-"))) %gt;%   ggplot(aes(x=time, y= Value, color= as.factor(place)))    geom_point()   geom_line(aes(group=place))   scale_x_date(date_labels="%b %y",date_breaks ="1 month")   facet_grid(place~., scales= "free_y")    theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))  

введите описание изображения здесь

Первый ответ: С facet_grid

 library(ggplot2) df %gt;%   mutate(time = paste(month, year, sep = "-")) %gt;%   ggplot(aes(x=time, y= Value, color= as.factor(place)))    geom_point()   geom_line(aes(group=place))   facet_grid(place~., scales= "free_y")  

введите описание изображения здесь

Без facet_grid State is not in the provided фрейма данных as.

  1. вам не нужно сначала подавать yearmon заявку, а затем менять класс обратно на персонажа
 library(ggplot2) library(dplyr) df %gt;%   mutate(time = paste(month, year, sep = "-")) %gt;%   ggplot(aes(x=time, y= Value, color= as.factor(place)))    geom_point()   geom_line(aes(group=place))  

введите описание изображения здесь

данные:

 structure(list(year = c(2017L, 2017L, 2017L, 2017L, 2017L, 2017L,  2018L, 2018L, 2018L, 2018L, 2018L, 2018L), month = c(11L, 11L,  11L, 12L, 12L, 12L, 11L, 11L, 11L, 12L, 12L, 12L), place = c("A",  "B", "C", "A", "B", "C", "A", "B", "C", "A", "B", "C"), Value = c(8L,  14L, 17L, 55L, 12L, 69L, 42L, 25L, 21L, 26L, 81L, 14L), time = structure(c(NA_real_,  NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,  NA_real_, NA_real_, NA_real_, NA_real_), class = "yearmon")), row.names = c("1",  "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"), class = "data.frame")  

Комментарии:

1. Я допустил ошибку в вопросе. Я изменил «состояние» на место

2. посмотрите на свои графики. У него та же проблема, которую я хочу подчеркнуть. 11-2017, затем наступает 11-2018 вместо 12-2017

3. Пожалуйста, ознакомьтесь с моими обновлениями. Я перешел на формат даты.

Ответ №2:

Это работает для меня —

 library(zoo) library(ggplot2)  df$time lt;- as.yearmon(paste(df$year,df$month), "%Y %m")  ggplot(df, aes(x=time, y= Value, color= as.factor(place)))     geom_point()    geom_line(aes(group=1))     facet_grid(place~., scales = "free_y")  

введите описание изображения здесь

данные

 df lt;- structure(list(year = c(2017L, 2017L, 2017L, 2017L, 2017L, 2017L,  2018L, 2018L, 2018L, 2018L, 2018L, 2018L), month = c(11L, 11L,  11L, 12L, 12L, 12L, 11L, 11L, 11L, 12L, 12L, 12L), place = c("A",  "B", "C", "A", "B", "C", "A", "B", "C", "A", "B", "C"), Value = c(8L,  14L, 17L, 55L, 12L, 69L, 42L, 25L, 21L, 26L, 81L, 14L)),  class = "data.frame", row.names = c(NA, -12L))  

Комментарии:

1. Это работает. Но в чем же разница?

2. Разница в 1. year столбец в вашем коде 2 пишется по-другому. Для вашего предыдущего кода в facet_grid нем нет переменной с именем State . @Maharrnab

Ответ №3:

В вопросе есть несколько проблем с кодом:

  1. столбец yearmon преобразуется в символ, поэтому он больше не является непрерывным
  2. df содержит год, но в коде используется Год

Устранения этих проблем было бы достаточно, но вместо этого предложите использовать автозапуск. Используя входные данные, воспроизводимые в Примечании в конце, преобразуйте df в объект z зоопарка, а затем выполните простую команду автозапуска в одну строку с использованием scale_x_yearmon.

Убедитесь, что df указан в верхней части вопроса, а также в Примечании в конце, и НЕ включает столбец времени, добавленный в код вопроса.

В read.zoo аргумент индекса указывает, в каких столбцах находится индекс времени (год и месяц), аргумент разделения указывает, как разделить результат на столбцы (по одному столбцу для каждого места), а аргумент FUN предоставляет функцию для преобразования двух столбцов индекса в индекс года. Затем, как уже упоминалось, используйте autoplot.zoo со шкалой_x_yearmon_.

Некоторые необязательные элементы заключаются в том, что если требуется одна панель, показывающая все графики, то добавьте в вызов автозапуска аргумент facets=NULL. Также добавьте facet_free (), если вы хотите свободно варьировать масштабы, хотя будет удобнее проводить сравнения, если используется один и тот же масштаб, как показано ниже.

 library(ggplot2) library(zoo)  to_ym lt;- function(y, m) as.yearmon(paste(y, m, sep = "-")) z lt;- read.zoo(df, index = c("year", "month"), split = "place", FUN = to_ym)  autoplot(z, col = Series)   scale_x_yearmon(n = 20)  

скриншот

Примечание

Ввод в воспроизводимой форме:

 Lines lt;- "year month place Value 1 2017 11 A 8 2 2017 11 B 14 3 2017 11 C 17 4 2017 12 A 55 5 2017 12 B 12 6 2017 12 C 69 7 2018 11 A 42 8 2018 11 B 25 9 2018 11 C 21 10 2018 12 A 26 11 2018 12 B 81 12 2018 12 C 14" df lt;- read.table(text = Lines)