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