You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为cowplot绘制的2×4箱线图面板底部4图设置X轴标题

解决cowplot 2×4布局中仅底部子图显示X轴标题的问题

这个需求很常见,用cowplot其实很容易实现,核心思路就是分别控制第一行和第二行子图的X轴标题显示状态——第一行的子图隐藏X轴标题,第二行的子图保留(或添加)目标标题。下面给你一个完整的可运行示例:

步骤1:准备示例数据和依赖包

首先加载需要的包并构造模拟数据(你可以替换成自己的真实数据):

library(ggplot2)
library(cowplot)

# 构造模拟数据:2种站点类型、8种化学物质、10次重复
set.seed(123)
df <- expand.grid(
  site_type = c("A", "B"),
  chemical = paste0("Chem_", 1:8),
  rep = 1:10
)
df$concentration <- rnorm(nrow(df), mean = 5, sd = 1)

步骤2:生成子图并控制X轴标题

循环生成8个箱线图,对第一行的4个图隐藏X轴标题(甚至可以隐藏X轴刻度,让布局更简洁),第二行的4个图添加site type作为X轴标题:

plots <- lapply(1:8, function(i) {
  # 筛选当前化学物质的数据
  target_chem <- paste0("Chem_", i)
  sub_df <- df[df$chemical == target_chem, ]
  
  # 基础箱线图
  p <- ggplot(sub_df, aes(x = site_type, y = concentration)) +
    geom_boxplot(fill = "#4292c6") +
    labs(title = target_chem, y = "Concentration") +
    theme_bw()
  
  # 控制X轴标题显示:前4个图(第一行)隐藏,后4个图(第二行)显示
  if (i <= 4) {
    p <- p + theme(
      axis.title.x = element_blank(),
      axis.text.x = element_blank(),  # 可选:如果不需要第一行的X轴刻度,就加上这行
      axis.ticks.x = element_blank()
    )
  } else {
    p <- p + labs(x = "site type")
  }
  
  return(p)
})

步骤3:组合成2×4布局

用plot_grid将子图排列成2行4列,开启对齐参数让所有图的坐标轴对齐更整齐:

final_plot <- plot_grid(
  plotlist = plots,
  nrow = 2,
  ncol = 4,
  align = "hv",  # 水平+垂直对齐
  axis = "tb",   # 对齐顶部和底部的坐标轴
  labels = "AUTO"  # 可选:给子图添加自动编号,方便引用
)

print(final_plot)

额外选项:统一底部大标题

如果你不想给每个底部子图都加标题,而是想要一个横跨所有底部子图的统一X轴大标题,可以在组合图生成后用draw_label添加:

# 在组合图底部居中添加统一标题
draw_plot_label(
  label = "site type",
  x = 0.5,
  y = 0.01,
  size = 12,
  hjust = 0.5,
  fontface = "bold"
)

这样就能完美实现你要的效果啦!

内容的提问来源于stack exchange,提问作者Mike_989

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:50:30