ggplot中如何将双Y轴标题居中放置在坐标轴顶部
双Y轴标题顶部居中对齐实现方案
调整逻辑
当前代码的标题偏移问题,来自轴标题对齐参数的默认设置不符合目标效果,仅需修改theme函数内的轴标题对齐参数,无需改动原有坐标轴映射、几何图层的实现逻辑即可达到要求。
具体参数修改要点
- 左轴(
Mask)标题:取消靠左对齐设置,调整水平对齐为居中,同时将垂直位置上移至与坐标轴顶部齐平 - 右轴(
No Mask)标题:取消靠右对齐设置,调整水平对齐为居中,同步将垂直位置上移至与坐标轴顶部齐平 - 适当增加绘图区域的顶部边距,避免上移的标题与图区内容重叠
可直接替换运行的修正代码
数据加载、图层绘制部分保持原有逻辑不变,仅替换theme模块的参数设置:
data %>% ggplot(mapping = aes(x = date, group = 1)) + geom_line(mapping = aes(y = mask, color = "mask"), size = 1.5) + geom_line(mapping = aes(y = noMask + 11, color = "noMask"), size = 1.5) + scale_colour_manual(values = c("#ffc000", "#5b9bd5")) + scale_x_discrete(expand = c(0, 0)) + scale_y_continuous(name = "Mask", breaks = seq(15, 25, 2), expand = c(0, 0), limits = c(15, 26), sec.axis = sec_axis(~. - 11, name = "No Mask", breaks = seq(4, 14, 2))) + theme_minimal() + expand_limits(x = c(0.5, 23.5)) + geom_vline(xintercept=seq(0.5, 23.5, 1), colour='grey85') + theme( legend.position = "None", # 增大顶部边距为标题预留位置 plot.margin = unit(c(2, 1, 0.5, 1), "cm"), panel.grid.major.x = element_blank(), panel.grid.minor.y = element_blank(), axis.title.x = element_blank(), axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1, size = 8), # 左轴标题:水平居中,垂直对齐到轴顶 axis.title.y.left = element_text( angle = 0, vjust = 1.3, # 可根据实际出图效果在1.1-1.5区间微调 hjust = 0.5, color = "#ffc000" ), # 右轴标题:水平居中,垂直对齐到轴顶 axis.title.y.right = element_text( angle = 0, vjust = 1.3, hjust = 0.5, color = "#5b9bd5" ) )
微调说明
如果出图后标题位置仍有偏差,可手动调整vjust参数值:
- 参数值越大,标题位置越靠上
- 参数值越小,标题位置越靠下
全程无需引入额外扩展包,基础ggplot2参数即可实现与目标图一致的标题效果。
内容的提问来源于stack exchange,提问作者Mark Pauley
相关产品推荐
相关产品推荐

