如何使geom_point四个分组的中位数标签等距对齐?
问题描述
在使用ggplot的geom_point绘图时,添加了中位数线,通过设置hjust = -1.5将中位数标签放在线的右侧,但第四个分组的标签错位,距离中位数线明显比其他分组远。推测是因为该分组的中位数数值位数更多(其余为个位数)导致的,请问怎么调整才能让所有标签和对应中位数线保持等距?
用户提供的代码:
ggplot(UK_12wk1, aes(x = experiment_flag, y = Message_numbers_3m)) + geom_point(cex = 1.5, pch = 1.0, position = position_jitter(w = 0.1, h =0)) + scale_y_continuous(limits = c(0,100), breaks = seq(0, 100, 10)) + stat_summary(fun = 'median', aes(colour = "median"), geom = "crossbar", width = 0.4) + stat_summary(aes(label=round(..y..,2)), fun = 'median', geom = 'label', size = 4, hjust = -1.5) + scale_x_discrete(limits = c("Control", "Reactive text", "Reactive premium", "Proactive")) + geom_hline(yintercept = 0, linetype = 'dashed', color = "blue") + theme(axis.text.x = element_text(size = 10, face = "italic", vjust = 0.65), axis.ticks.x = element_blank(), axis.title.x = element_text(size = 16)) + theme(axis.title.y = element_text(size = 16), legend.title = element_text(size = 16), plot.title = element_text(size = 20, face = "bold")) + labs(x = "Group", y = "Messages sent", color = NULL)

解决方法
问题出在hjust的作用逻辑上:它是基于文本自身宽度的相对位置调整,文本越长(数值位数多),相同hjust值下的绝对偏移距离就越大,所以会出现错位。要让标签和中位数线保持固定距离,应该用基于x轴坐标的绝对偏移,而非相对的hjust。
具体调整步骤:
- 移除
hjust = -1.5参数,改用position_nudge()来设置x方向的固定偏移量。因为离散x轴的每个分组默认对应坐标1、2、3、4,所以给x设置一个固定的小数值(比如0.2,可根据图表实际宽度微调),就能让所有标签相对于中位数线向右偏移相同距离。
修改后的关键代码行:
stat_summary(aes(label=round(..y..,2)), fun = 'median', geom = 'label', size = 4, position = position_nudge(x = 0.2))
如果担心标签和散点重叠,还可以同时添加y方向的小偏移,比如:
position = position_nudge(x = 0.2, y = 1)
这样不管标签文本长度如何,所有标签都会和对应中位数线保持一致的距离,解决错位问题。
内容的提问来源于stack exchange,提问作者Louis Talay
相关产品推荐
相关产品推荐

