如何通过两个变量使geom_text的hjust与绘图点正确对齐?
问题描述
我能轻松让第一个geom_text和绘图点对齐,但用第二个geom_text调用另一变量时,文本没法和对应点对齐。相关代码如下:
#library(devtools) #devtools::install_github("camdenk/mlbplotR") #library(ggplot2) Top10 %>% ggplot(aes(x=xba.x, y=1:10)) + mlbplotR::geom_mlb_headshots(aes(player_id = player_id, x = xba.x + 0.006), height = 0.12)+ geom_point(colour = "black") + geom_segment(aes(x=xba.y, xend=xba.x, y= 1:10, yend=1:10))+ theme_classic()+ geom_point(aes(x=xba.x, y=1:10))+ geom_point(aes(x=xba.y, y=1:10))+ geom_text(aes(label = xba.y), vjust = -0.55, size = 3.0)+ geom_text(aes(label = xba.x), vjust = -0.55, hjust = 10, size = 3.0)
绘图效果:
修复方法
问题根源有两个:
- 全局
aes里设置了x=xba.x,导致所有图层默认继承这个x坐标,第一个geom_text没指定x,其实是用了xba.x的位置,只是刚好视觉上没偏差;第二个geom_text错误设置了hjust=10——hjust的合理取值范围是0到1,超过1的数值会让文本直接偏离点的位置。 - 两个
geom_text都没明确绑定对应点的x坐标,逻辑上就不对。
修改后的代码如下:
#library(devtools) #devtools::install_github("camdenk/mlbplotR") #library(ggplot2) Top10 %>% ggplot(aes(y=1:10)) + # 全局只保留y轴映射,x轴在每个图层单独指定 mlbplotR::geom_mlb_headshots(aes(player_id = player_id, x = xba.x + 0.006), height = 0.12)+ geom_point(aes(x=xba.x), colour = "black") + geom_segment(aes(x=xba.y, xend=xba.x, yend=1:10))+ theme_classic()+ geom_point(aes(x=xba.x))+ geom_point(aes(x=xba.y))+ # 绑定xba.y的x坐标,让文本和对应点对齐 geom_text(aes(x=xba.y, label = xba.y), vjust = -0.55, size = 3.0)+ # 绑定xba.x的x坐标,用hjust=1让文本在点的左侧(要放右侧就用hjust=0) geom_text(aes(x=xba.x, label = xba.x), vjust = -0.55, hjust = 1, size = 3.0)
核心调整:
- 删掉全局
aes里的x=xba.x,避免默认继承带来的混乱,每个需要x轴的图层单独指定x值,逻辑更清晰。 - 把第二个
geom_text的hjust改成0-1之间的合理值,比如1就能让文本紧贴xba.x点的左侧,完美对齐。 - 给两个
geom_text都明确指定对应的x参数,确保文本和目标点一一对应。
内容的提问来源于stack exchange,提问作者user19422662
相关产品推荐
相关产品推荐

