ggplot2 перекрестный эффект на легенде - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь построить два нормальных распределения и два влайна с указанием среднего значения.Когда я делаю это с ggplot2, легенда становится крестом, из-за чего трудно увидеть, что один из них - пунктирная линия.

ggplot(data = data.frame(x = c(-1, 6)), aes(x)) +
  stat_function(fun = dnorm, n = 100, args = list(mean = 2, sd = 1), aes(linetype = "a")) +
  stat_function(fun = dnorm, n = 100, args = list(mean = 3, sd = 1), aes(linetype = "b")) +
  scale_linetype_manual("Density Function", values = c(1, 2)) +
  labs(x = "Value", y = "Probability Density") +
  geom_vline(aes(xintercept = 2, colour = "mean1"), show.legend = TRUE) +
  geom_vline(aes(xintercept = 3, colour = "mean2"), show.legend = TRUE, linetype = 2) +
  scale_colour_manual("Mean", values = c(mean1 = "#F8766D", mean2 = "#C77CFF"), 
                      labels = c("Mean a", "Mean b")) +
  ggtitle("Legend Help")

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

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

Исправление, рекомендованное Хэдли, состояло в том, чтобы вызвать show.legend = NA

Я воспроизвел ваш сюжет, выполняя это (полный код ниже), и проблема исчезла:

ggplot(data = data.frame(x = c(-1, 6)), aes(x)) +
stat_function(fun = dnorm, n = 100, args = list(mean = 2, sd = 1), aes(linetype = "a")) +
stat_function(fun = dnorm, n = 100, args = list(mean = 3, sd = 1), aes(linetype = "b")) +
scale_linetype_manual("Density Function", values = c(1, 2)) +
labs(x = "Value", y = "Probability Density") +
geom_vline(aes(xintercept = 2, colour = "mean1"), show.legend = NA) +
geom_vline(aes(xintercept = 3, colour = "mean2"), show.legend = NA, linetype = 2) +
scale_colour_manual("Mean", values = c(mean1 = "#F8766D", mean2 = "#C77CFF"), 
                  labels = c("Mean a", "Mean b")) +
ggtitle("Legend Help")

enter image description here

0 голосов
/ 17 ноября 2018
ggplot(data = data.frame(x = c(-1, 6)), aes(x)) +
  stat_function(
    fun = dnorm, n = 100, args = list(mean = 2, sd = 1), aes(linetype = "a")
  ) +
  stat_function(
    fun = dnorm, n = 100, args = list(mean = 3, sd = 1), aes(linetype = "b")
  ) +
  geom_vline(
    data = data.frame(
      xintercept = c(2, 3), colour = c("mean1", "mean2"),
      stringsAsFactors = FALSE
    ),
    aes(xintercept = xintercept, colour = colour)
  ) +
  scale_colour_manual(
    name = "Mean", 
    values = c(mean1 = "#F8766D", mean2 = "#C77CFF"), 
    labels = c("Mean a", "Mean b")
  ) +
  scale_linetype_manual("Density Function", values = c(1, 2)) +
  labs(
    x = "Value", y = "Probability Density", title = "Legend Help"
  ) 

enter image description here

show.legend=TRUE заставлял наследовать всю эстетику линии. Если оставить значение NA, то наследство исчезнет, ​​а тот факт, что вы использовали сопоставленную эстетику для vline (который я немного изменил), означает, что вы все равно получите бесплатную легенду vline бесплатно.

...