Я работаю с языком программирования R. Я использовал функцию Melt() из библиотеки «rehsape», чтобы мои данные выглядели примерно так:
library(dplyr)
library(ggplot2)
library(reshape2)
library(scales)
Table_1 <- data.frame(
"Col_A" = c("2002-01", "2002-01", "2002-01", "2002-02", "2002-02", "2002-02", "2002-03", "2002-03", "2002-03"),
"Col_B" = c("AAA", "AAB", "AAC", "AAA", "ABB", "AAC", "AAA", "AAB", "AAC"),
"Col_C" = c(111, 122.5, 9, 727, 66.4, 3, 992, 88, 12)
)
Col_A - это дата в форме: год-месяц
Столбцы из таблицы имеют следующий формат:
Table_1$Col_A = as.character(Table_1$Col_A)
Table_1$Col_B = as.factor(Table_1$Col_B)
Table_1$Col_C = as.numeric(Table_1$Col_C)
Отсюда я использую функцию Melt():
melt = melt(Table_1, id = c("Col_A"))
Теперь я хочу представить эти данные в следующем виде:
p = ggplot(melt, aes(x = Col_A, y=value, group = 1)) + geom_line(aes(color=variable)) + facet_grid(variable ~., scales = "free_y")
Мои реальные данные немного сложнее, и я пытаюсь изменить даты (у меня их много), чтобы они не казались загроможденными.
Я пытаюсь:
p = ggplot(melt, aes(x = Col_A, y=value, group = 1)) + geom_line(aes(color=variable)) + facet_grid(variable ~., scales = "free_y") + scale_x_date(date_labels = "m%-%y", date_breaks = '1 month') + theme(axis.text, x = element_text(angle = 45))
с последующим:
final = p + scale_y_continuous(labels = comma)
Но я получаю эту ошибку: Error: Invalid input: date_trans works with objects of class Date only
Может кто-нибудь показать мне, что я делаю неправильно? Спасибо
Я думаю, что ваши даты хранятся в виде символов вместо выделенных классов даты/даты и времени, поэтому, возможно, их стоит преобразовать.
Обратите внимание, что при использовании melt
вы объединили числовые и символьные значения вместе, что сделало столбец value
символом, поэтому числа, которые вы видите, на самом деле являются символами, а не числами.
Чтобы решить эту проблему, вам нужно преобразовать столбец Col_A
в класс даты, чтобы использовать scale_x_date
.
library(dplyr)
library(ggplot2)
melt %>%
mutate(Col_A = as.Date(paste0(Col_A, '-01'))) %>%
ggplot(aes(x = Col_A, y=value, group = 1)) +
geom_line(aes(color=variable)) +
facet_grid(variable ~., scales = "free_y") +
scale_x_date(date_labels = "%m-%y", date_breaks = '1 month') +
theme(axis.text = element_text(angle = 45))
спасибо, кажется, это работает! Не могли бы вы объяснить логику этой строки кода: mutate(Col_A = as.Date(paste0(Col_A, '-01'))) %>% ... почему "вставить"? почему ""-01"? спасибо!
@Noob paste0
просто соединяет строки вместе, поэтому paste0("stack", "overflow")
создает строку "stackoverflow"
. Чтобы строки символов интерпретировались как дата, они должны быть в формате «ГГГГ-мм-дд», а ваши — в формате «ГГГГ-мм», поэтому им нужен «-01» в конце. из них, чтобы преобразовать их в правильный формат для чтения в виде дат.
Спасибо за ваш ответ! если мои даты указаны в символьном формате (будь то г-м-д, м-д, г-м и т. д.), могу ли я всегда использовать «paste0» для решения этой проблемы?
не всегда. Вам нужно изменить код в зависимости от формата вашей даты. Здесь у вас была дата в стандартном формате (Y-m-d), поэтому использования as.Date
без указания формата было достаточно. Но если у вас есть даты в другом формате, вы можете передать определенный формат в as.Date
. Кроме того, в ymd
есть такие функции, как dmy
, mdy
, lubridate
и т. д., которые помогут вам легко конвертировать даты.
По моим собственным данным, я продолжаю получать эту ошибку при запуске вашего кода. Ошибка: хотя бы один слой должен содержать все переменные фасетирования: «переменная». В сюжете отсутствует «переменная». В слое 1 отсутствует «переменная». Знаете ли вы, что может быть причиной этой проблемы? Можно ли просто добавить одну строку кода, которая изменяет тип даты... и тогда я смогу вернуться к использованию ggplot, как раньше? Спасибо
Это необходимая строка: Table_1$Col_A<-as.Date(paste0(Table_1$Col_A,"-01"))
У вас нет значений даты.
2002-01
должно быть свиданием? ему нужен месяц, день, год, чтобы быть датой. R как отдельный тип данных для дат, поэтому вам нужно будет преобразовать его из символа. Это год/месяцы? Вы хотите предположить, что каждое значение относится к первому числу месяца?