在 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"))
这种设置可以让您在不更改数据的情况下轻松调整图表。
我正在尝试创建一个直方图,上面覆盖有垂直线。其中一条垂直线显示目标,其余垂直线显示百分位数。我希望代表目标的线与其他线不同。
我有数据框中的行数据:
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"))
这种设置可以让您在不更改数据的情况下轻松调整图表。