Как отобразить эти данные в правильном порядке дат?

#r #ggplot2

#r #ggplot2

Вопрос:

У меня есть такой фрейм данных (в порядке дат):

 freq date
3    Jan-18
2    Feb-18
42   Mar-18
2    Apr-18
4    May-18
 

Однако, когда я отображаю это с помощью следующего кода, он не упорядочивается по порядку, сохраненному в фрейме данных. Вместо этого он отображает их в алфавитном порядке (см. Ось x). Как это можно исправить, чтобы график выполнялся в порядке, сохраненном во фрейме данных?

Обратите внимание, что столбец даты имеет тип character, что, вероятно, и является причиной, но изменить его на формат даты сложно, поскольку нет дня, и когда вы это делаете, он меняется, например, с 18 июня на 01-1918-06, что не очень хорошо выглядит на графике. Итак, я пытаюсь сделать это, не меняя формат даты, если это возможно.

 ggplot(df, aes(x = date, y = freq))   
  geom_point()
 

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

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

1. Также стоит проверить, как это видит R / ggplot. Используйте class(df$date) , чтобы убедиться, что он видит столбец как дату. При необходимости используйте пакет lubridate для преобразования в правильный класс.

Ответ №1:

1) Предполагая, что данные, воспроизводимые в примечании в конце, преобразуют данные в серию зоопарка с индексом года (который может представлять год и месяц без дня), и в этом случае это прямое использование autoplot.zoo . Опустите аргумент geom, если вам нужен линейный график.

 library(ggplot2)
library(zoo)

z <- read.zoo(df, index = "date", FUN = as.yearmon, format = "%b-%y")
autoplot(z, geom = "point")   scale_x_yearmon()
 

скриншот

2) Это тоже работает:

 library(dplyr)
library(ggplot2)
library(zoo)

df %>%
  mutate(date = as.yearmon(date, format = "%b-%y")) %>%
  ggplot(aes(date, freq))   geom_point()   scale_x_yearmon()
 

Примечание

 Lines <- "
freq date
3    Jan-18
2    Feb-18
42   Mar-18
2    Apr-18
4    May-18"
df <- read.table(text = Lines, header = TRUE)
 

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

1. Спасибо, это работает! Я раньше не пользовался zoo — вы не знаете, можно ли отредактировать это в ggplot? Например, изменение названий и так далее?

2. Добавить ggtitle("my series") в конец строки autoplot или ggplot .

Ответ №2:

Другой способ, и если данные отображаются, как в примере, может быть:

 library(dplyr)
#Code
df %>%
  mutate(date=factor(date,levels = unique(date),ordered = T)) %>%
  ggplot(aes(x=date,y=freq)) 
  geom_point()
 

Вывод:

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

Или форматирование переменной даты:

 #Code2
df %>%
  mutate(date=as.Date(paste0(date,'-01'),'%b-%y-%d')) %>%
  ggplot(aes(x=date,y=freq)) 
  geom_point() 
  scale_x_date(date_labels = '%b-%y') 
  ggtitle('My title')
 

Вывод:

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

Некоторые используемые данные:

 #Data
structure(list(freq = c(3L, 2L, 42L, 2L, 4L), date = c("Jan-18", 
"Feb-18", "Mar-18", "Apr-18", "May-18")), class = "data.frame", row.names = c(NA, 
-5L))
 

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

1. Спасибо! Для вашего первого решения, если я попытаюсь использовать geom_line() вместо geom_point() , данные не отображаются на графике. Вы знаете, почему / как исправить?

2. @HelpNeeded4 Привет, дорогой, я тестировал и работал с geom_line, попробуйте это, пожалуйста geom_line(aes(group=1))

3. Отлично, спасибо — это сработало. Что означает group = 1 для интереса?

4. @HelpNeeded4 Этот параметр создает подгонку, так что есть только одна строка, это также зависит от того, какие данные вы строите!

Ответ №3:

Если вы не хотите полагаться на пакет zoo, вы можете просто выбрать год (например, 2021), и преобразование столбца даты в вашем примере работает нормально. Затем вы можете указать, как дата отображается в ggplot2 scale_x_date() . Вот как это выглядит.

 library(ggplot2)

df <- read.table(header = T, text = "
freq date
3    Jan-18
2    Feb-18
42   Mar-18
2    Apr-18
4    May-18")

df$date <- as.Date(paste0(df$date, "-2021"), format = "%B-%d-%Y")


ggplot(df, aes(date, y = freq))   
  geom_point()  
  theme_bw()  
  labs(x = "Date", y = "Frequency")  
  scale_x_date(date_breaks = "2 weeks", date_labels = "%d-%b")  
  theme(axis.text.x = element_text(angle = 45, vjust = 0.5))