Я пытаюсь построить диаграмму рассеяния для двух переменных большого набора данных временных рядов в R, и мне хотелось бы выделить данные за один из месяцев и вывести их заранее. Я пробовал некоторые ранее предложенные решения на форумах, но они, похоже, не работают (возможно, потому, что вопросы немного устарели, и некоторые аргументы могут быть изменены в более новых версиях). Пока у меня есть это:
set.seed(123)
date=seq(as.POSIXct("2022-04-01 00:00:00"), as.POSIXct("2022-10-31 23:00:00"), by = "hour")
t= abs(rnorm(length(date)))
y= exp(t)+ rnorm(length(date), mean = 0, sd = 3)
df<-data.frame(date=date,t=t,y=y)
df$month<-month(df$date)
highlight_month <- 1
non_highlighted_colors <- rep("grey", length(unique(df$month)))
non_highlighted_colors[highlight_month] <- "red"
df$order<-ifelse(df$month==highlight_month,1,2)
ggplot(df, aes(t, y)) +
geom_point(aes(color = factor(month),order=order)) +
scale_color_manual(values = non_highlighted_colors) +
labs(color = "Month") +
theme_minimal()
Первое, что я получаю, это то, что заказ был проигнорирован. Я думаю, возможно, это потому, что я замечаю, что если я выделю месяц 1 в коде, это означает месяц 4 в фрейме данных, и когда я запускаю заказ, он будет искать январь, которого нет в данных.
В этом ли причина того, что код не работает?
Спасибо за любое предложение
Я думаю, есть много способов сделать это. Мой любимый способ — сначала отобразить все данные с помощью scale_color_manual (чтобы иметь красивую легенду) и добавить еще один слой geom_point() с определенным цветом. Однако я думаю, что вы были близки, вы допустили несколько небольших ошибок: 1) У вас нет дат в январе (первый месяц), df$order<-ifelse(df$month==highlight_month,1,2) должно быть что-то вроде df$order<-ifelse(df$month==4,1,2) (использование логики первого месяца, начинающегося в апреле, сбивает с толку) 2 ) используйте df %>% arrange(desc(order)) как data вашего ggplot
См. этот пример из документации ggplot. Вам нужно разделить график на два geom_point, чтобы один был нарисован поверх другого.
Спасибо за комментарии. Это фиктивный набор данных, созданный для иллюстрации моей проблемы (извините, если это сбило с толку, но это был единственный способ, которым я знал, как создать столбец даты в час). В других строках я просто пытаюсь выделить месяц и затем попытаться вставить векторы в ggplot, но это не сработало.





Вы можете упростить задачу, сопоставив цвет с условием и указав цветовую шкалу вручную:
ggplot(df, aes(t, y)) +
geom_point(aes(colour = month == 4)) +
scale_colour_manual(values = c("grey", "red")) +
labs(colour = "Month") +
theme_minimal()
Но вы, вероятно, захотите перенести выделенные точки на передний план, поэтому вам нужно будет разделить график на две geom_point, чтобы убедиться, что выделенные точки отображаются после (т. е. сверху) серых:
ggplot(df, aes(t, y)) +
geom_point(data = df[df$month != 4, ], aes(colour = month == 4)) +
geom_point(data = df[df$month == 4, ], aes(colour = month == 4)) +
scale_colour_manual(values = c("grey", "red")) +
labs(colour = "Month") +
theme_minimal()
Вероятно, вам нужна более красивая легенда, поэтому вы можете сделать что-то вроде создания переменной factor с условием выделения и сопоставить ее с цветом:
df$highlight <- factor(df$month == 4,
levels = c(T, F),
labels = c("April", "Other"))
ggplot(df, aes(t, y)) +
geom_point(data = df[df$highlight == "Other", ], aes(colour = highlight)) +
geom_point(data = df[df$highlight == "April", ], aes(colour = highlight)) +
scale_colour_manual(values = c("grey", "red")) +
labs(colour = "Month") +
theme_minimal()
Но поскольку порядок легенды соответствует порядку построения, Other стоит в легенде первым, и это выглядит странно. Это можно исправить, указав как разрывы, так и значения цветовой шкалы:
ggplot(df, aes(t, y)) +
geom_point(data = df[df$highlight == "Other", ], aes(colour = highlight)) +
geom_point(data = df[df$highlight == "April", ], aes(colour = highlight)) +
scale_colour_manual(breaks = c("April", "Other"),
values = c("red", "grey")) +
labs(colour = "Month") +
theme_minimal()
Я не уверен, но предлагаю вам попробовать запустить код в новом сеансе, где вместо создания набора векторов свободных имен и их последующего объединения в фрейм данных вы создаете их внутри вызова
data.frame. Таким образом, вы можете получить сообщения об ошибках, указывающие на ошибки в спецификации аргументовggplot. В текущей ситуации есть две копии «дата», «t» и «y», и мы не можем быть уверены, получает ли интерпретатор одну или другую. (Если все сделано правильно, это также позволит меньше печатать.)