Tenho um gráfico mostrando os valores observados, uma previsão para cada valor e uma faixa atrás dele indicando a região de erro da previsão. Algo assim:
library(dplyr)
library(lubridate)
library(tidyr)
library(ggplot2)
set.seed(1234)
df <- economics %>%
mutate(year = year(date)) %>%
group_by(year) %>%
summarise(pop = mean(pop, na.rm = TRUE)) %>%
ungroup() %>%
select(year, pop) %>%
rowwise() %>%
mutate(pred_factor = runif(1, 0, 2)) %>%
mutate(limit_factor = runif(1, 0.5, 0.8)) %>%
ungroup() %>%
mutate(pred = pop * pred_factor) %>%
mutate(limit_distance = pred * limit_factor) %>%
mutate(lower_limit = pred - limit_distance) %>%
mutate(upper_limit = pred + limit_distance) %>%
select(year, pop, pred, lower_limit, upper_limit)
df %>%
pivot_longer(cols = c(pop, pred), names_to = 'metric', values_to = 'value') %>%
ggplot(aes(x = year, y = value,
ymin = lower_limit, ymax = upper_limit,
linetype = metric)) +
geom_ribbon(fill = 'lightblue') +
geom_line() +
theme_bw()
No entanto, eu gostaria de separar a cor da fita em seu próprio item de legenda, para que eu possa rotulá-la separadamente. O melhor que eu consegui até agora é isto:
df %>%
pivot_longer(cols = c(pop, pred), names_to = 'metric', values_to = 'value') %>%
mutate(shading = 'predicted range') %>%
ggplot(aes(x = year, y = value,
ymin = lower_limit, ymax = upper_limit,
linetype = metric, fill = shading)) +
geom_ribbon() +
geom_line() +
scale_fill_manual(values = c('predicted range' = 'lightblue')) +
theme_bw()
Mas por algum motivo essa abordagem cria um preenchimento cinza escuro atrás dos dois itens 'métricos' neste, tornando-os essencialmente ilegíveis. Existe uma maneira diferente de organizar esses dados e gráficos para que isso seja funcional?
Basta mover a estética específica da faixa e da linha para fora
ggplot()
e para dentro de seus respectivos geoms:(Na verdade, você obterá o resultado desejado apenas mudando
aes(linetype = metric)
para , mas tambémgeom_line()
movi a estética para baixo por questões de consistência.)geom_ribbon()