Изменение порядка построения линий так, чтобы одна была сверху для временных рядов в ggplot - PullRequest
0 голосов
/ 06 августа 2020

, поэтому я рисую данные временного ряда на ggplot для проекта, над которым я работаю. Вот как выглядят данные: Примеры данных:

structure(list(Date = c("2015-01-01", "2015-02-01", "2015-03-01", 
"2015-04-01"), Actual = c(500L, 600L, 700L, 750L), Fcst1 = c(600L, 
610L, 634L, 650L), Fcst2 = c(500L, 630L, 875L, 900L), Fcst3 = c(500L, 
600L, 754L, 800L), Fcst4 = c(500L, 600L, 700L, 760L)), class = "data.frame", row.names = c(NA, 
-4L))
Date        Actual Fcst1 Fcst2 Fcst3 Fcst4
2015-01-01  500    600   500   500   500
2015-02-01  600    610   630   600   600
2015-03-01  700    634   875   754   700
2015-04-01  750    650   900   800   760
..........  ...    ...   ...   ...   ...

Сами данные хранятся еще 60 месяцев, и всего существует 40 прогнозов, скорректированных ежемесячно. Когда я пытаюсь построить его, я хочу, чтобы фактическая линия была наверху, но в итоге она строится первой. Вот код, который я использую:

df <- df %>%
  mutate(Date = ymd(Date))
colnames(df)[3:length(df)] <-
  paste("df", colnames(df[, c(3:length(df))]), sep = "")
ggplot(
  tidyr::pivot_longer(df, c(Fcst1:Fcst6, Actual), names_to = "Forecast", names_prefix = "df"),
  aes(Date, value, color = Forecast)
) +
  geom_line(size = 1) +
  scale_color_manual(values = c(
    "Fcst1" = "red", "Fcst2" = "blue",
    "Fcst3" = "green", "Fcst4" = "yellow", "Fcst5" = "purple",
    "Fcst6" = "orange", "Actual" = "black"
  )) +
  ggtitle(label = "Actuals vs Forecasts", subtitle = "Dataset") +
  ylab("Rate") +
  scale_y_continuous(labels = scales::comma)

Тем не менее, я хочу сохранить порядок в легенде, поэтому я хочу, чтобы наверху были фактические значения, а затем порядок прогнозов, перечисленных в scale_color_manual. Прямо сейчас сначала строятся фактические значения (что означает, что они находятся под всеми другими прогнозами), и я хочу, чтобы они были сверху (и желательно с более толстой линией, возможно, size=1.2. Спасибо!

1 Ответ

1 голос
/ 06 августа 2020

Вот возможное решение с использованием включенных вами данных. Вы должны отформатировать уровни Forecast и изменить scale_color_manual() для легенды. Я добавил для этого трюк:

library(tidyverse)
#Data
df <- structure(list(Date = c("2015-01-01", "2015-02-01", "2015-03-01", 
"2015-04-01"), Actual = c(500L, 600L, 700L, 750L), Fcst1 = c(600L, 
610L, 634L, 650L), Fcst2 = c(500L, 630L, 875L, 900L), Fcst3 = c(500L, 
600L, 754L, 800L), Fcst4 = c(500L, 600L, 700L, 760L)), class = "data.frame", row.names = c(NA, 
-4L))

#Format date
df <- df %>% mutate(Date = ymd(Date))
#Create data for plot
df2 <- tidyr::pivot_longer(df, c(Fcst1:Fcst4, Actual), names_to = "Forecast", names_prefix = "df")
#Format levels 
labs <- unique(df2$Forecast)
i1 <- labs[which(labs=='Actual')]
i2 <- rev(labs[which(labs!='Actual')])
i3 <- c(i2,i1)
df2$Forecast <- factor(df2$Forecast,levels=i3,ordered = T)
#Plot
ggplot(df2,aes(Date, value, color = Forecast)) +
  geom_line(size = 1) +
  scale_color_manual(values = c(
    "Fcst1" = "red", "Fcst2" = "blue",
    "Fcst3" = "green", "Fcst4" = "yellow", "Fcst5" = "purple",
    "Fcst6" = "orange", "Actual" = "black"
  ),guide = guide_legend(reverse=TRUE)) +
  ggtitle(label = "Actuals vs Forecasts", subtitle = "Dataset") +
  ylab("Rate") +
  scale_y_continuous(labels = scales::comma)

Вывод:

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

...