在共享Y轴且含正负值的patchwork图中添加geom_text的方法
给正负分栏柱状图添加精准定位的geom_text标签
要实现正负数值标签的准确定位,核心是根据柱子的正负方向调整标签的垂直位置(vjust)或y轴偏移量,确保标签清晰不被遮挡。以下是针对你的代码的修改方案:
修改p1图表(Schulform分栏图)
在原有代码基础上,分别给正负柱子添加geom_text:
p1 <- ggplot() + geom_col( data = data_schule_schulform, aes(fill = Herkunftsschulform, y = Anzahl, x = Schuljahr) ) + # 给正数值添加标签:放在柱子顶部外侧 geom_text( data = data_schule_schulform, aes(y = Anzahl, x = Schuljahr, label = Anzahl), vjust = -0.3, # 向上偏移,避免被柱子遮挡 size = 3 ) + geom_hline(yintercept = 0, color = "white", size = 1.5) + geom_col( data = data_2_schule_schulform, aes(fill = Schulform, y = Anzahl * -1, x = Schuljahr) ) + # 给负数值添加标签:放在柱子底部(靠近y=0一侧)外侧 geom_text( data = data_2_schule_schulform, aes(y = Anzahl * -1, x = Schuljahr, label = Anzahl), vjust = 1.3, # 向下偏移,靠近y=0方向 size = 3 ) + theme_minimal() + theme( legend.position = "none", axis.text.y = element_text(size = 8), axis.text.x = element_blank() ) + scale_y_continuous(limits = c(-max_oben, max_oben))
修改p3图表(Jahrgang分栏图)
同样的逻辑,给正负柱子添加标签:
p3 <- ggplot() + geom_col( data = data_schule_jahrgang, aes(fill = Jahrgang, y = Anzahl, x = Schuljahr) ) + # 正数值标签:柱子顶部外侧 geom_text( data = data_schule_jahrgang, aes(y = Anzahl, x = Schuljahr, label = Anzahl), vjust = -0.3, size = 3 ) + geom_hline(yintercept = 0, color = "white", size = 1.5) + geom_col( data = data_2_schule_jahrgang, aes(fill = Jahrgang, y = Anzahl * -1, x = Schuljahr) ) + # 负数值标签:柱子底部外侧 geom_text( data = data_2_schule_jahrgang, aes(y = Anzahl * -1, x = Schuljahr, label = Anzahl), vjust = 1.3, size = 3 ) + theme_minimal() + theme( legend.position='right', legend.justification = "center", legend.direction = "vertical", legend.text = element_text(size = 9.5), axis.text.y = element_text(size = 8), axis.text.x = element_blank() ) + scale_y_continuous(limits = c(-max_oben, max_oben))
调整说明
- 如果希望标签放在柱子内部,可调整
vjust值:正柱子用vjust = 1.2(柱子顶部内侧),负柱子用vjust = -0.2(柱子底部内侧)。 - 若柱子高度较小,标签容易重叠,可给y值添加固定偏移,比如正柱子用
y = Anzahl + 0.5,负柱子用y = Anzahl * -1 - 0.5,偏移量根据你的数据范围调整。 - 标签大小可通过
size参数修改,确保可读性。
plot_oben <- p1 | p3
#plot_unten <- p2 | p4
#plot <- plot_oben / plot_unten
内容的提问来源于stack exchange,提问作者Felix
相关产品推荐
相关产品推荐

