0

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

我有数据框中各行的数据:

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()

我得到这个结果:

在此处输入图像描述

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

任何帮助将非常感激!

4

1 回答 1

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

ggplot将您想要的实际颜色/尺寸/线型放入数据框中是不寻常的(而不是您可能想要在图例上的有意义的标签,就像您为 所做的那样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"))

此设置使您可以轻松调整图表而无需更改数据。

于 2020-05-29T19:13:18.333 回答