#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.
- вам не нужно сначала подавать
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:
В вопросе есть несколько проблем с кодом:
- столбец yearmon преобразуется в символ, поэтому он больше не является непрерывным
- 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)