如何为分面ggplot的x轴添加仅显示一次的自定义说明标签
解决方案
这里给两种可直接落地的实现方法:
方法1:annotation_custom + 关闭裁剪(最简单原生方案)
利用ggplot原生的自定义注解功能,配合关闭绘图区域裁剪实现仅在最左侧显示补充说明:
首先加载需要的依赖包:
library(grid)
在你现有绘图代码的基础上,添加以下内容即可:
# 先创建文本grob axis_note_grob <- textGrob( "storagetype\nglycerol\nfreeze-thaw-cycle", x = 0, y = 0.5, # 文本自身对齐规则 just = "left", gp = gpar(fontsize = 9) # 可自行调整字号 ) # 在原有绘图代码末尾追加以下内容 plot_t1calc1 + # 添加自定义注解,调整坐标匹配你要的x=-1、y轴标签下方的位置 annotation_custom( grob = axis_note_grob, xmin = -2.2, xmax = -0.8, # 调整x范围控制左右位置 ymin = 0.1, ymax = 10 # 调整y范围控制上下位置,注意你的y轴是log10刻度,要对应数值范围 ) + coord_cartesian(clip = "off") + # 关键:关闭绘图区域裁剪,才能显示区域外的内容 # 补充左边距,避免文本被截断 theme(plot.margin = margin(l = 35, b = 10, t = 10, r = 10, unit = "pt"))
如果发现多个分面都显示了文本,只需要把annotation_custom替换为ggannotate::geom_annotation,指定data = ~filter(.x, timepoint == first(timepoint))即可仅在第一个分面渲染注解。
方法2:patchwork 拼图方案(可控性最高)
如果需要更精准控制文本位置,不想调整坐标适配log轴,可将文本单独做成一个空白子图和原图拼接:
library(patchwork) # 制作仅包含补充文本的空白图 note_plot <- ggplot() + geom_text(aes(x = 1, y = 1, label = "storagetype\nglycerol\nfreeze-thaw-cycle"), size = 3) + theme_void() + xlim(0,2) + ylim(0,2) # 拼接两图,调整宽度比例 note_plot + plot_t1calc1 + plot_layout(widths = c(1, 20)) # 调整宽度比例控制文本和原图的间距
参数调整说明
- 方法1的
xmin/xmax:数值越小,文本越靠左,根据你的显示效果微调即可 - 方法1的
ymin/ymax:根据你y轴的实际数值范围调整,和x轴标签对齐即可 - 两种方法都可以自行调整文本字号、行间距匹配你的图表风格
内容的提问来源于stack exchange,提问作者Anika
相关产品推荐
相关产品推荐

