Использование geom_colour_manual для получения легенды, где ggplot включает в себя как линию регрессии, так и линию ab - PullRequest
1 голос
/ 03 июня 2019

У меня есть график geom_point, к которому я добавил как регрессионную линию geom_smooth (которую я хочу отобразить в виде пунктирной серой линии), так и geom_abline (которую я хочу отобразить в виде сплошной черной линии). Я могу сделать это, но проблема возникает, когда я пытаюсь включить легенду, обозначающую две строки.

Я потратил более четырех часов на рассмотрение каждого вопроса о стековом потоке, который выглядит неопределенно релевантным, а также раздела R cookbook для scale_XXX_manual и легенд, и мне кажется, что я понимаю, что требуется, а именно, задаю цвет и тип линии с помощью фиктивных переменных в aes для соответствующего geom, а затем определяем эти фиктивные переменные в операторах scale_XXXX_manual с использованием опции values=, как я сделал в следующем коде

df <- data.frame(xvar=c(1, 1.7, 2, 2.47, 3.47),
                 yvar=c(-0.543,  0.326,  0.147,  0.554,  1.180),
                 wtvar=c(167,  43, 965, 841,  84))
ggplot(df, aes(x=xvar, y=yvar))+
  geom_point()+
  geom_smooth(method="lm", 
              mapping = aes(weight = wtvar, colour="A", linetype="B"))+
  geom_abline(slope=1, intercept = (-1.3), aes(colour="C", linetype="D"), size=1)+
  ylim(-1,2.5)+
  theme_classic()+
  scale_colour_manual(name="Legend", 
                      labels=c("regression", "benchmark"),
                      values=c(A="grey85", C="black"))+
  scale_linetype_manual(name="Legend", 
                        labels=c("regression", "benchmark"),
                        values=c(B="dashed", D="solid"))

Я получаю следующую ошибку:

Ошибка: ggplot2 не знает, как обращаться с данными класса Unval

Объяснение того, почему то, что я сделал, не работает, а также рекомендации по правильному решению, будут очень благодарны.

Обновление: объединение двух операторов aes в geom_smooth, как это было предложено (спасибо Z. Lin - я думал, что опция отображения была связана только с регрессией, но теперь я понимаю, что это все эстетика) останавливает сообщение об ошибке и получает много ближе к желаемому результату. Сам сюжет выглядит так, как и должен, но недостающий фрагмент головоломки - это включение контрольной линии в легенду. Я получаю легенду только с пунктирной серой линией, идентифицированной как линия регрессии.

1 Ответ

0 голосов
/ 03 июня 2019

Попробуйте поместить slope и intercept в geom_abline aes

ggplot(df, aes(x=xvar, y=yvar))+
  geom_point()+
  geom_smooth(method="lm", 
              aes(weight = wtvar, colour="A", linetype="B"))+
  geom_abline(aes(slope=1, intercept = (-1.3), colour="C", linetype="D"), size=1)+
  ylim(-1,2.5)+
  theme_classic()+
  scale_colour_manual(name="Legend", 
                      labels=c("regression", "benchmark"),
                      values=c(A="grey85", C="black"))+
  scale_linetype_manual(name="Legend", 
                        labels=c("regression", "benchmark"),
                        values=c(B="dashed", D="solid"))
...