在 ggplot2 中使用 aes 映射设置 geom_vline 线型和大小

Set geom_vline line types and sizes with aes mapping in ggplot2

我正在尝试创建一个直方图,上面覆盖有垂直线。其中一条垂直线显示目标,其余垂直线显示百分位数。我希望代表目标的线与其他线不同。

我有数据框中的行数据:

lines
   qntls        lbs heights    lts lsz
1  29.00      p5=29 32.2400 dashed 0.1
2  45.25     p25=45 33.5296 dashed 0.1
3  79.00     p50=79 30.9504 dashed 0.1
4 128.00    p75=128 32.2400 dashed 0.1
5 249.25    p95=249 33.5296 dashed 0.1
6 120.00 Target=120 30.9504  solid 0.2

然后我使用 lines 数据框创建 geom_vline 和 geom_label 对象:

ggplot() +
  geom_histogram(
    data = h,
    mapping = aes(
      x = DAYSTODECISION
    ),
    breaks = brks,
    color = clr,
    fill = f
  ) +
  geom_vline(
    data = lines,
    mapping = aes(
      xintercept = qntls,
      color = lbs,
      linetype = lts,
      size = lsz
    ),
    show.legend = FALSE
  ) +
  geom_label(
    data = lines,
    mapping = aes(
      x = qntls,
      y = heights,
      label = lbs,
      hjust = 0 # Label starts on line and extends right
    )
  ) +
  ggtitle(title) +
  labs(
    x = xlab,
    y = ylab
  ) +
  theme_classic()

我得到这个结果:

我希望目标线为实线,所有其他线为虚线。由于某种原因,与 lines 数据框相比,这在图表中是相反的。此外,我希望目标线的粗度是其他线的两倍,但事实并非如此。

如有任何帮助,我们将不胜感激!

  # your plot code ... +
  scale_linetype_identity() +
  scale_size_identity()

ggplot 中将您想要的实际 colors/sizes/linetypes 放入数据框中是不寻常的(而不是像 lbs 那样在图例上放置您可能想要的有意义的标签), 但如果你这样做 identity 天平就是你的朋友。

更标准的方法可能是这样设置您的数据:

   qntls        lbs heights is_target 
1  29.00      p5=29 32.2400        no
2  45.25     p25=45 33.5296        no
3  79.00     p50=79 30.9504        no
4 128.00    p75=128 32.2400        no
5 249.25    p95=249 33.5296        no
6 120.00 Target=120 30.9504       yes

然后将 linetype = is_target, size = is_target 映射到 aes() 中,并像这样使用手动比例尺:

... + 
scale_size_manual(values = c("no" = 0.1, "yes" = 0.2)) +
scale_linetype_manual(values = c("no" = "dashed", "yes" = "solid"))

这种设置可以让您在不更改数据的情况下轻松调整图表。