ggplot2对图例的交叉影响

时间:2018-11-17 20:19:49

标签: r ggplot2 legend

我正在尝试绘制两个正态分布和两个表示均值的vline。当我使用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 :(得分:2)

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图例。

答案 1 :(得分:0)

GitHub上的

This讨论似乎正在解决类似的问题。

Hadley建议的解决方法是致电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