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

如何为ggplot2的plot_grid组合图添加行列标题?

如何为cowplot组合图添加行标题与列标题?

你可以通过cowplot原生扩展、ggpubr的ggarrange或者patchwork包这几种方式实现行/列标题的添加,以下是具体方案:

原代码回顾

你当前的组合图代码如下:

library(ggplot2)
library(cowplot)
library(ggpubr)
theme_set(theme_cowplot())

df1 <- data.frame(x = 1:12, y = (1:12)^2)
df1$grp = c('A', 'B', 'C')

df2 <- data.frame(x = 1:12, y = (1:12)^2)
df2$grp = c('D', 'E')

df3 <- data.frame(x = 1:12, y = (1:12)^2)
df3$grp = c('F', 'G', 'H','I')

df4 <- data.frame(x = 1:12, y = (1:12)^2)
df4$grp = c('J', 'K')

p1 <- ggplot(df1, aes(x, y, color=grp)) + geom_point()
leg1 <- get_legend(p1)
leg1 <- as_ggplot(leg1)
p1 = p1 + theme(legend.position = "none",axis.title.x =element_blank(),axis.title.y =element_blank())

p2 <- ggplot(df2, aes(x, y, color=grp)) + geom_point()
leg2 <- get_legend(p2)
leg2 <- as_ggplot(leg2)
p2 = p2 + theme(legend.position = "none",axis.title.x =element_blank(),axis.title.y =element_blank())

p3 <- ggplot(df3, aes(x, y, color=grp)) + geom_point()
leg3 <- get_legend(p3)
leg3 <- as_ggplot(leg3)
p3 = p3 + theme(legend.position = "none",axis.title.x =element_blank(),axis.title.y =element_blank())

p4 <- ggplot(df4, aes(x, y, color=grp)) + geom_point()
leg4 <- get_legend(p4)
leg4 <- as_ggplot(leg4)
p4 = p4 + theme(legend.position = "none",axis.title.x =element_blank(),axis.title.y =element_blank())

方案1:基于cowplot原生实现

通过分步组合标题与子图,先给每行添加行标题,再组合所有行并添加列标题:

# 创建行标题(左对齐加粗)
row_title1 <- ggdraw() + draw_label("行标题1", fontface='bold', x=0, hjust=0)
row_title2 <- ggdraw() + draw_label("行标题2", fontface='bold', x=0, hjust=0)
row_title3 <- ggdraw() + draw_label("行标题3", fontface='bold', x=0, hjust=0)
row_title4 <- ggdraw() + draw_label("行标题4", fontface='bold', x=0, hjust=0)

# 组合每行的图与行标题
row1 <- plot_grid(row_title1, plot_grid(p1,p1,p1,leg1, ncol=4, rel_widths=c(2,2,2,0.5)), 
                  ncol=1, rel_heights=c(0.1, 1))
row2 <- plot_grid(row_title2, plot_grid(p2,p2,p2,leg2, ncol=4, rel_widths=c(2,2,2,0.5)), 
                  ncol=1, rel_heights=c(0.1, 1))
row3 <- plot_grid(row_title3, plot_grid(p3,p3,p3,leg3, ncol=4, rel_widths=c(2,2,2,0.5)), 
                  ncol=1, rel_heights=c(0.1, 1))
row4 <- plot_grid(row_title4, plot_grid(p4,p4,p4,leg4, ncol=4, rel_widths=c(2,2,2,0.5)), 
                  ncol=1, rel_heights=c(0.1, 1))

# 创建列标题
col_title1 <- ggdraw() + draw_label("列标题1", fontface='bold')
col_title2 <- ggdraw() + draw_label("列标题2", fontface='bold')
col_title3 <- ggdraw() + draw_label("列标题3", fontface='bold')
col_title4 <- ggdraw() + draw_label("图例", fontface='bold')
col_titles <- plot_grid(col_title1, col_title2, col_title3, col_title4, 
                        ncol=4, rel_widths=c(2,2,2,0.5))

# 组合所有元素得到最终图
final_plot <- plot_grid(col_titles, row1, row2, row3, row4, 
                        ncol=1, rel_heights=c(0.1, 1, 1, 1, 1))
print(final_plot)

方案2:用ggpubr的ggarrange快速实现

ggarrange自带row.names和col.names参数,直接设置即可添加标题,代码更简洁:

# 先组合每行的子图
row1 <- ggarrange(p1,p1,p1,leg1, ncol=4, widths=c(2,2,2,0.5))
row2 <- ggarrange(p2,p2,p2,leg2, ncol=4, widths=c(2,2,2,0.5))
row3 <- ggarrange(p3,p3,p3,leg3, ncol=4, widths=c(2,2,2,0.5))
row4 <- ggarrange(p4,p4,p4,leg4, ncol=4, widths=c(2,2,2,0.5))

# 组合所有行并添加行/列标题
final_plot <- ggarrange(row1, row2, row3, row4, 
                        nrow=4,
                        row.names = c("行标题1", "行标题2", "行标题3", "行标题4"),
                        col.names = c("列标题1", "列标题2", "列标题3", "图例"),
                        align = "hv",
                        font.label = list(size=12, face="bold"))
print(final_plot)

方案3:用patchwork包实现(语法更直观)

patchwork是ggplot2生态中更现代的绘图组合工具,通过inset_element添加标题:

library(patchwork)
library(grid)

# 构建每行的组合
row1 <- (p1 + p1 + p1 + leg1) + plot_layout(widths=c(2,2,2,0.5))
row2 <- (p2 + p2 + p2 + leg2) + plot_layout(widths=c(2,2,2,0.5))
row3 <- (p3 + p3 + p3 + leg3) + plot_layout(widths=c(2,2,2,0.5))
row4 <- (p4 + p4 + p4 + leg4) + plot_layout(widths=c(2,2,2,0.5))

# 组合所有行
base_plot <- row1 / row2 / row3 / row4

# 添加列标题(顶部)
final_plot <- base_plot +
  inset_element(textGrob("列标题1", gp=gpar(fontface="bold")), 
                left=0, right=0.25, top=1, bottom=1.05) +
  inset_element(textGrob("列标题2", gp=gpar(fontface="bold")), 
                left=0.25, right=0.5, top=1, bottom=1.05) +
  inset_element(textGrob("列标题3", gp=gpar(fontface="bold")), 
                left=0.5, right=0.75, top=1, bottom=1.05) +
  inset_element(textGrob("图例", gp=gpar(fontface="bold")), 
                left=0.75, right=1, top=1, bottom=1.05)

# 添加行标题(左侧旋转90度)
final_plot <- final_plot +
  inset_element(textGrob("行标题1", gp=gpar(fontface="bold"), rot=90), 
                left=-0.05, right=0, top=0.875, bottom=0.625) +
  inset_element(textGrob("行标题2", gp=gpar(fontface="bold"), rot=90), 
                left=-0.05, right=0, top=0.625, bottom=0.375) +
  inset_element(textGrob("行标题3", gp=gpar(fontface="bold"), rot=90), 
                left=-0.05, right=0, top=0.375, bottom=0.125) +
  inset_element(textGrob("行标题4", gp=gpar(fontface="bold"), rot=90), 
                left=-0.05, right=0, top=0.125, bottom=0)

print(final_plot)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:25:24