R ggplot2 :: geom_vline图例未正确显示线型

时间:2018-03-29 05:28:10

标签: r ggplot2 legend

我正在尝试这个简单的任务,我希望在ggplot对象中添加两条垂直线,使用不同的颜色和不同的线条类型,并在图例中正确指定颜色/线条。我一直在查看this post,其中绘制了两个geom_vline s。如果您更改其中一种线型,例如为实体,图例错误地显示线型。它将所有线条变为实体。

library(ggplot2)
library(ggthemes)
ggplot(aes(x = Sepal.Length), data = iris) + 
  geom_histogram(color = 'black', fill = NA) + 
  geom_vline(aes(xintercept = median(iris$Sepal.Length),
                 color = "median"), 
             linetype = "solid", size = 1) +
  geom_vline(aes(xintercept = mean(iris$Sepal.Length),
                 color = "mean"), 
             linetype = "dashed", size = 1) +
  scale_color_manual(
    name = "statistics", 
    values = c(median = "blue", mean = "red"))

enter image description here

在没有任何附加数据的情况下,我也尝试了以下内容:

library(ggplot2)
library(ggthemes)
ggplot() + theme_bw() + 
  geom_vline(aes(xintercept = c(0, 0.2), 
                 color = c("Zero", "Pooled")), 
             size = 1, linetype = c("solid", "dotdash")) +
scale_color_manual(
  name = "statistics", 
  values = c(Zero = "black", Pooled = "blue"))

其中线型错误地显示在图例上。

enter image description here

任何人都可以指出我正在进行什么以及如何让线型正确显示?

1 个答案:

答案 0 :(得分:4)

您可以将linetype置于aes来电,就像您对彩色一样:

ggplot(aes(x = Sepal.Length), data = iris) + 
    geom_histogram(color = 'black', fill = NA) + 
    geom_vline(aes(xintercept = median(iris$Sepal.Length),
                   color = "median", linetype = 'median'), 
               size = 1) +
    geom_vline(aes(xintercept = mean(iris$Sepal.Length),
                   color = "mean", linetype = "mean"), 
               size = 1) +
    scale_color_manual(
        name = "statistics", 
        values = c(median = "blue", mean = "red")) +
    scale_linetype_manual(
        name = "statistics", 
        values = c(median = "solid", mean = "dashed"))

当你指定哪个值匹配哪个线型也有帮助时使用命名向量 - 我认为你的第二个例子失败的原因是在图例中,ggplot按字母顺序将线型分配给等级。

输出:

enter image description here