ggplot2中geom_text文本始终居中?hjust参数失效问题求助
问题原因
你将所有文本的x值固定为1,且x轴默认范围仅围绕该值,导致hjust的对齐效果无法通过视觉体现——实际上hjust已经生效,但因为没有足够的x轴空间作为参照,看起来都像“居中”状态。
解决方案
要让hjust的对齐效果可视化,可通过扩展x轴范围或模拟表格单元格两种方式实现:
方案1:扩展x轴范围
添加scale_x_continuous扩大x轴显示范围,直观展示对齐效果:
df1 <- data.frame(a = letters[1:9], b = c('0.0 (-3.1, 3.0)','5.2 (1.6, 8.9)','2.5 (0.9, 4.1)','19.9 (14.7, 25.1)','7.0 (3.7, 10.4)','3.8 (1.3, 6.3)','1.2 (-0.1, 2.5)','0.0 (-0.2, 0.2)','21.4 (16.4, 26.4)')) t_af <- ggplot(data=df1) + geom_text(aes(y=a, x=1, label=b, vjust=0.5, hjust = 0)) + ggtitle("aAF, % (95% CI)") + xlab(" ") + theme_classic(base_size = 10) + theme( axis.line = element_blank(), axis.text.y = element_blank(), axis.ticks = element_blank(), axis.title.y = element_blank(), axis.text.x = element_text(color="white"), plot.title = element_text(size=12, hjust = .5) ) + scale_y_discrete(limits=rev(df1$a)) + scale_x_continuous(limits = c(0, 2)) # 扩展x轴范围,展示对齐差异 t_af
此时设置hjust=0,文本会以x=1为左边界向右排列;hjust=1则以x=1为右边界向左排列。
方案2:用geom_tile模拟表格单元格
若要实现表格单元格内的对齐效果,先绘制单元格背景,再在其中对齐文本:
df1 <- data.frame(a = letters[1:9], b = c('0.0 (-3.1, 3.0)','5.2 (1.6, 8.9)','2.5 (0.9, 4.1)','19.9 (14.7, 25.1)','7.0 (3.7, 10.4)','3.8 (1.3, 6.3)','1.2 (-0.1, 2.5)','0.0 (-0.2, 0.2)','21.4 (16.4, 26.4)')) t_af <- ggplot(data=df1) + geom_tile(aes(y=a, x=1), width=1.5, height=0.8, fill="white", color="black") + # 绘制单元格背景 geom_text(aes(y=a, x=1, label=b, vjust=0.5, hjust = 0), margin = margin(l=5)) + # 单元格内左对齐,添加边距 ggtitle("aAF, % (95% CI)") + xlab(" ") + theme_classic(base_size = 10) + theme( axis.line = element_blank(), axis.text.y = element_blank(), axis.ticks = element_blank(), axis.title.y = element_blank(), axis.text.x = element_text(color="white"), plot.title = element_text(size=12, hjust = .5) ) + scale_y_discrete(limits=rev(df1$a)) + scale_x_continuous(limits = c(0, 2)) t_af
这种方式下,hjust的对齐是相对于单元格边缘,更符合表格的视觉预期。
内容的提问来源于stack exchange,提问作者Colin
相关产品推荐
相关产品推荐

