如何在geom_bar()中为每个X类别添加中位数线?
解决方案
1. 解决中位数线贯穿整个图表的问题
你用geom_hline会画出贯穿全图的线,是因为它默认基于全局y轴值绘制,没有和x轴的类别绑定。要给每个类别单独绘制对应中位数的短横线,有两种简单方法:
方法一:用geom_crossbar仅保留横线部分
将geom_crossbar的ymin和ymax都设为中位数,同时设置宽度匹配柱子宽度,这样只会显示对应柱子上方的中位数横线:
ggplot(your_data, aes(x = EX_ABS, y = RM_ABS)) + geom_col() + geom_crossbar(aes(ymin = RM_MED, ymax = RM_MED), width = 0.8, color = "red")
width=0.8可根据你的柱子宽度调整,确保横线刚好覆盖对应柱子范围。
方法二:用geom_segment自定义横线位置
通过将x轴类别转为数值位置,手动控制横线的左右端点,精准匹配柱子:
ggplot(your_data, aes(x = EX_ABS, y = RM_ABS)) + geom_col() + geom_segment( aes( x = as.numeric(EX_ABS) - 0.4, xend = as.numeric(EX_ABS) + 0.4, y = RM_MED, yend = RM_MED ), color = "red" )
as.numeric(EX_ABS)把类别转为数值位置,±0.4用于调整横线长度,对应默认柱子宽度(默认宽度为0.8)。
2. 解决Unicode形状显示异常的问题
geom_point的shape参数仅支持内置形状编号(0-25)或少数特定符号,无法直接使用任意Unicode字符。要显示\u1397,需用geom_text替代,并指定支持该字符的字体:
ggplot(your_data, aes(x = EX_ABS, y = RM_MED)) + geom_col(aes(y = RM_ABS)) + geom_text( aes(label = "\u1397"), family = "Segoe UI Symbol", # 替换为你系统中支持该字符的字体 size = 6, color = "blue" )
- 不同系统适配字体不同:Windows可用
"Segoe UI Symbol",Mac可用"Apple Symbols",Linux可用"DejaVu Sans"。 - 若不确定可用字体,可在R中用
windowsFonts()(Windows)或quartzFonts()(Mac)查看系统字体列表。
内容的提问来源于stack exchange,提问作者gerard
相关产品推荐
相关产品推荐

