ggplot2中geom_text标签对齐异常求助:如何使线段起止标签全部向外对齐
ggplot2中geom_text标签对齐异常求助:如何使线段起止标签全部向外对齐
嗨,这个问题我之前也碰到过!其实问题出在你对hjust="outward"的理解和ggplot实际的逻辑不一样——ggplot里的outward是相对于整个绘图面板的边缘来判断对齐方向的,而不是相对于你的线段起止方向。
比如你Country1的起点日期,它在整个x轴面板的中间位置,ggplot没法判断你要的“外”是哪边,就会出现错误的向内对齐。要实现你想要的“线段起点标签向左、终点标签向右”的效果,得手动根据每个点是起点还是终点来指定对齐方式。
下面是修改后的代码,你可以直接运行试试:
library(dplyr) library(stringr) library(ggplot2) library(lubridate) library(tidyr) Dur <- tibble(Country = c('Country1', 'Country2'), start = c(18836, 18523) %>% as_date, end = c(19034, 18865) %>% as_date) Dur %>% pivot_longer(-1, values_to = "Dates", names_to = "PointType") %>% # 保留点的类型(start/end) mutate(label.text = Dates %>% format("%B %d") %>% str_remove("(?<=.{3}).+(?= )"), # 根据点类型设置hjust:起点左对齐(标签在点左侧),终点右对齐(标签在点右侧) hjust_val = case_when( PointType == "start" ~ 1.1, # hjust=1是右对齐,加0.1让标签离点远一点 PointType == "end" ~ -0.1 # hjust=0是左对齐,减0.1让标签离点远一点 )) %>% ggplot(aes(x = Dates, y = Country, label = label.text)) + geom_line(linewidth = 0.6, color = "red") + geom_text(aes(hjust = hjust_val)) + # 使用自定义的hjust值 scale_x_date(limits = c(as_date(Dur$start %>% min)-30, as_date(Dur$end %>% max)+30), date_breaks = "3 month", date_labels = "%d/%m/%Y") + theme_bw()
简单解释下修改的关键点:
- 用
names_to = "PointType"保留了原来的start/end标识,这样就能区分每个点是线段的起点还是终点 - 通过
case_when给起点和终点分别设置hjust值:- 起点用
hjust=1.1:文本右对齐,标签整体会出现在点的左侧(远离线段的方向) - 终点用
hjust=-0.1:文本左对齐,标签整体会出现在点的右侧(远离线段的方向)
- 起点用
- 你可以调整
1.1和-0.1的数值,来控制标签和线段之间的距离,找到最适合的效果
这样修改后,所有线段的起止标签都会按照你想要的“向外”方向对齐啦!
备注:内容来源于stack exchange,提问作者G. Ke
相关产品推荐
相关产品推荐

