Я рисую одни и те же данные в разных временных масштабах (неделя, месяц, квартал и т. д.) с помощью ggplot, и в результате я извлекаю данные из разных столбцов. Однако, когда я вижу свою легенду, я хочу, чтобы это был определенный порядок.
Я знаю, что если бы все группирующие переменные были в одном столбце, я мог бы установить его как упорядоченный фактор, как это объясняет здесь, но мои данные распределены по нескольким столбцам. Я также попробовал предложения здесь о переупорядочивании нескольких геометрий, но это не сработало.
Поскольку мой фактический набор данных очень сложен, я воспроизвел уменьшенную версию, в которой есть только данные за неделю и месяц. Что касается окончательного ответа, пожалуйста, позвольте ему указать конкретный порядок, а не что-то вроде rev(), потому что в моем фактическом наборе данных у меня есть 6 столбцов, которым нужен определенный порядок.
Вот код для воспроизведения - для этого первые 3 фрагмента составляют набор данных, поэтому только 4-й фрагмент для создания графика должен иметь отношение к фактическому решению. По умолчанию R показывает порядок, сначала показывая «Оценка — месяц» в легенде, поэтому я хотел бы посмотреть, как я могу сделать это вторым.
library(dplyr)
library(ggplot2)
library(lubridate)
#Generates week data -- shouldn't be relevant to troubleshoot
by_week <- tibble(Week = seq(as.Date("2011-01-01"), as.Date("2012-07-01"), by = "weeks"),
Week_score = c(sample(100:200, 79)),
Month = ymd(format(Week, "%Y-%m-01")))
#Generates month data -- shouldn't be relevant to troubleshoot
by_month <- tibble(Month = seq(as.Date("2011-01-01"), as.Date("2012-07-01"), by = "months"),
Month_score = c(sample(150:200, 19)))
#Joins data and removes duplications of month data for easier plotting -- shouldn't be relevant to troubleshoot
all_time <- by_week %>%
full_join(by_month) %>%
mutate(helper = across(c(contains("Month")), ~paste(.))) %>%
mutate(across(c(contains("Month")), ~ifelse(duplicated(helper), NA, .)), .keep = "unused") %>%
mutate(Month = as.Date(Month))
#Makes plot - this is where I want the order in the legend to be different
all_time %>%
ggplot(aes(x = Week)) +
geom_line(aes(y= Week_score, colour = "Week_score")) +
geom_line(data=all_time[!is.na(all_time$Month_score),], aes(y = Month_score, colour = "Month_score")) + #This line tells R just to focus on non-missing values for Month_score
scale_colour_discrete(labels = c("Week_score" = "Score - Week", "Month_score" = "Score - Month"))
Вот как выглядит текущая легенда: я хочу, чтобы порядок переключался с помощью решения, масштабируемого до более чем двух вариантов. Благодарю вас!





Как упомянул @stefan прямо в комментариях, вы должны установить названия своих ярлыков в опции limitsscale_colour_discrete. Вы можете добавить больше столбцов самостоятельно. Вы можете использовать следующий код:
library(dplyr)
library(ggplot2)
library(lubridate)
#Generates week data -- shouldn't be relevant to troubleshoot
by_week <- tibble(Week = seq(as.Date("2011-01-01"), as.Date("2012-07-01"), by = "weeks"),
Week_score = c(sample(100:200, 79)),
Month = ymd(format(Week, "%Y-%m-01")))
#Generates month data -- shouldn't be relevant to troubleshoot
by_month <- tibble(Month = seq(as.Date("2011-01-01"), as.Date("2012-07-01"), by = "months"),
Month_score = c(sample(150:200, 19)))
#Joins data and removes duplications of month data for easier plotting -- shouldn't be relevant to troubleshoot
all_time <- by_week %>%
full_join(by_month) %>%
mutate(helper = across(c(contains("Month")), ~paste(.))) %>%
mutate(across(c(contains("Month")), ~ifelse(duplicated(helper), NA, .)), .keep = "unused") %>%
mutate(Month = as.Date(Month))
#Makes plot - this is where I want the order in the legend to be different
all_time %>%
ggplot(aes(x = Week)) +
geom_line(aes(y= Week_score, colour = "Week_score")) +
geom_line(data=all_time[!is.na(all_time$Month_score),], aes(y = Month_score, colour = "Month_score")) + #This line tells R just to focus on non-missing values for Month_score
scale_colour_discrete(labels = c("Week_score" = "Score - Week", "Month_score" = "Score - Month"), limits = c("Week_score", "Month_score"))
Выход:
Как видите, порядок меток изменился.
Вы можете установить порядок через пределы шкалы:
scale_colour_discrete(..., limits = c("Week_score", "Month_score"))