Я видел другие подобные вопросы и ответы на них;Я не смог получить от них ответ.Следовательно, этот вопрос.
Данные организованы таким образом, что я думал, что это позволит мне автоматически добавлять легенды, то есть аккуратные данные .Воспроизводимый пример показан ниже.
#Create Fake Data
set.seed(2019)
myDf = data.frame(time = rep(seq(1,5),2),
smax = rnorm(n = 10, mean = 10,sd = 2),
mean = rnorm(n = 10, mean = 5, sd = .8),
smin = rnorm(n = 10, mean = 1, sd = .001),
obser= rep(rnorm(n = 5, mean = 5, sd = 2),2),
type = rep(x = c(1,2),each = 5))
myDf[,6] = as.factor(myDf[,6])
.........................................................................
Как видите, это простой фрейм данных с 6 столбцами.Вы можете думать об этом фрейме данных как результат некоторого спора данных.Например, time
одинаково для двух типов (переменная type
).Переменная obser
также одинакова для обоих типов (1 и 2).
Моя цель построить график, на котором я буду использовать smin
и smax
в качестве предела для моего geom_ribbon
.Кроме того, я хочу построить переменную mean
в виде линии.Для этих двух слоев у меня будет fil
и color
, чтобы различать эти объекты по type
.
Проблема возникает с моим geom_line
для переменной obser
.Значения этой переменной одинаковы для обоих типов, поэтому нет причин применять к ним color
.Я хотел бы, чтобы они были напечатаны черным цветом (и также пунктирными, но не обязательно).
Вот код, который я написал для достижения этой цели:
# Plot data using ggplot2
myDf %>%
ggplot(aes( x = time, fill = factor(type))) +
geom_ribbon(aes(ymin = smin, ymax = smax), alpha = .25 ) +
geom_line(aes(y = mean, color = factor(type)), size = 1.2) +
geom_line(aes(y = obser), linetype = 2, size = .8) +
labs(x = "Time", y = "") +
theme_bw() +
scale_x_continuous(breaks = seq(from = 0, to = 5, by = .25)) +
scale_color_manual(values = c("#542788","#b35806","#000000"),
labels = c("Model A","Model B","Observed Value")) +
scale_fill_manual(values = c("#542788","#b35806"),
labels = c("Model A","Model B"))+
theme(legend.position = "bottom" , legend.title = element_blank())
С этим фрагментом кода мне удалось:
- Отобразите обе области с
geom_ribbon
удовлетворительно. - Иметь легенды для регионов и линий из переменной
mean
. - Построить переменную
obser
в виде черной пунктирной линии.
Можно утверждать, что код можно улучшить, и я с удовольствием приму указатели.Например, мне нужно было изменить название моих факторов в моей легенде, и я думаю, что должен был использовать mutate
, но я не мог выполнить то, что пытался сделать.Однако сейчас мне нужно добавить легенду к строке obser
, в которой написано «Observed Values».
Как я могу это сделать, желательно автоматическим способом?