如何为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
相关产品推荐
相关产品推荐

