Как я могу манипулировать функциями заливки и цвета ggplot2 для создания автоматической легенды для слоя? - PullRequest
0 голосов
/ 19 сентября 2019

Я видел другие подобные вопросы и ответы на них;Я не смог получить от них ответ.Следовательно, этот вопрос.

Данные организованы таким образом, что я думал, что это позволит мне автоматически добавлять легенды, то есть аккуратные данные .Воспроизводимый пример показан ниже.

#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()) 

enter image description here

С этим фрагментом кода мне удалось:

  1. Отобразите обе области с geom_ribbon удовлетворительно.
  2. Иметь легенды для регионов и линий из переменной mean.
  3. Построить переменную obser в виде черной пунктирной линии.

Можно утверждать, что код можно улучшить, и я с удовольствием приму указатели.Например, мне нужно было изменить название моих факторов в моей легенде, и я думаю, что должен был использовать mutate, но я не мог выполнить то, что пытался сделать.Однако сейчас мне нужно добавить легенду к строке obser, в которой написано «Observed Values».

Как я могу это сделать, желательно автоматическим способом?

1 Ответ

1 голос
/ 19 сентября 2019

Вы можете принудительно установить дополнительные значения легенды цвета, указав фиксированную метку, здесь я использовал «observ».Поскольку я не хочу разделять заливку и цветовую легенду, я указал это также для эстетики заливки, но использовал «прозрачный» для цвета и не показываю фон заливки:

ggplot(myDf, aes( x = time)) +
  geom_ribbon(aes(ymin = smin, ymax = smax, fill = factor(type)), alpha = .25 ) + 
  geom_line(aes(y = mean, color = factor(type)), size = 1.2) +
  geom_line(aes(y = obser, color = "observ", fill = "observ"), 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("1" = "#542788", "2" = "#b35806","observ" = "#000000"),
                     labels = c("Model A","Model B","Observed Value")) + 
  scale_fill_manual(values = c("1" = "#542788", "2" = "#b35806","observ" = "transparent"),
                    labels = c("Model A","Model B","Observed Value")) +
  theme(legend.position = "bottom" , legend.title = element_blank()) 

enter image description here

Это дает Warning:Ignoring unknown aesthetics: fill, потому что geom_line не использует эстетику заливки.

Использование фиксированного значения ("observ") вместо столбца (как type) внутри эстетики, создает новый класс цвета для этого единственного значения.Без указания ручной легенды, это приведет к тому, что цвет будет отличаться от черного, что часто приводит к запутанным моментам, таким как этот:

ggplot(data = data.frame(x = c(0, 1), y = c(0, 1))) +
  geom_line(aes(x, y, color = "green")) +
  geom_hline(aes(color = "black", yintercept = 0.5))

enter image description here

С именованным вектором внутри scale_color_manual и scale_fill_manual цвета точно отображаются на конкретные имена.Это полезно, когда вы не знаете, в каком порядке они появятся.

...