R语言corrplot相关图经ggarrange拼接后内容为空的问题问询
问题成因
你遇到的空白画布问题核心来自3个认知和语法错误:
corrplot()属于R base基础绘图系统的函数,默认返回值是相关系数计算结果、配置参数的列表,不是ggplot2体系的图形对象。函数运行时会直接在当前绘图设备输出图像,直接将函数运行结果赋值给变量,拿到的不是可复用的图对象,自然无法被排版函数识别。- 你在
corrplot()后用+ my.theme是完全错误的语法:只有ggplot对象支持用+叠加主题、图层,base绘图不支持这种操作,这一步会直接导致变量赋值结果异常。 ggpubr::ggarrange()是专门为ggplot对象设计的排版函数,本身不支持直接传入base绘图对象,你传入非图形类的变量时,只会生成空白布局框架,不会填充内容。
另外你的代码还有两个隐性问题:一是没有加载dplyr包,代码里用到的%>%、filter()、select()都来自dplyr,直接运行会报函数不存在的错误;二是ggarrange里设置ncol=9完全不符合需求,你只有2张图,设置9列会把图形挤压到不可见。
可行实现方案
你可以根据自己的需求选两种方案之一:
方案1:转换base图为grob对象,适配ggarrange排版
用grid包的捕获函数把corrplot输出的base图转成grid图形对象(grob),就可以正常传入ggarrange排版,注意去掉错误的+ my.theme语法,主题相关的设置直接写在corrplot的参数里即可。
修正后的可运行代码:
library(corrplot) library(psych) library(ggpubr) library(dplyr) library(grid) data(iris) # 计算setosa组皮尔逊相关结果 res_pearson.c_setosa<-iris%>% filter(Species=="setosa")%>% select(Sepal.Length:Petal.Width)%>% corr.test(., y = NULL, use = "complete",method="pearson",adjust="bonferroni", alpha=.05,ci=TRUE,minlength=5) # 捕获setosa组相关图为grob对象 corr.a <- grid.grabExpr({ corrplot(res_pearson.c_setosa$r[,1:3], type="lower", order="original", p.mat = res_pearson.c_setosa$p[,1:3], sig.level = 0.05, insig = "blank", col=col4(10), tl.pos = "ld", tl.cex = .8, tl.srt=45, tl.col = "black", cl.cex = .8) }) # 计算virginica组皮尔逊相关结果 res_pearson.c_virginica<-iris%>% filter(Species=="virginica")%>% select(Sepal.Length:Petal.Width)%>% corr.test(., y = NULL, use = "complete",method="pearson",adjust="bonferroni", alpha=.05,ci=TRUE,minlength=5) # 捕获virginica组相关图为grob对象 corr.b <- grid.grabExpr({ corrplot(res_pearson.c_virginica$r[,1:3], type="lower", order="original", p.mat = res_pearson.c_virginica$p[,1:3], sig.level = 0.05, insig = "blank", col=col4(10), tl.pos = "ld", tl.cex = .8, tl.srt=45, tl.col = "black", cl.cex = .8) }) # 排版拼接 ggarrange(corr.a, corr.b, ncol = 2, nrow = 1, labels = c("setosa", "virginica"))
方案2:直接用base绘图自带的排版函数,无需转换对象
如果不需要用ggplot体系的排版功能,直接用base绘图的par()函数设置布局即可,代码更简单,不需要额外做对象转换:
library(corrplot) library(psych) library(dplyr) data(iris) # 提前计算两组的相关结果,和方案1一致 res_pearson.c_setosa<-iris%>% filter(Species=="setosa")%>% select(Sepal.Length:Petal.Width)%>% corr.test(., y = NULL, use = "complete",method="pearson",adjust="bonferroni", alpha=.05,ci=TRUE,minlength=5) res_pearson.c_virginica<-iris%>% filter(Species=="virginica")%>% select(Sepal.Length:Petal.Width)%>% corr.test(., y = NULL, use = "complete",method="pearson",adjust="bonferroni", alpha=.05,ci=TRUE,minlength=5) # 设置1行2列的排版布局,调整边距 par(mfrow = c(1,2), mar = c(3,2,3,2)) # 绘制第一张图 corrplot(res_pearson.c_setosa$r[,1:3], type="lower", order="original", p.mat = res_pearson.c_setosa$p[,1:3], sig.level = 0.05, insig = "blank", col=col4(10), tl.pos = "ld", tl.cex = .8, tl.srt=45, tl.col = "black", cl.cex = .8, title = "setosa", mar = c(0,0,2,0)) # 绘制第二张图 corrplot(res_pearson.c_virginica$r[,1:3], type="lower", order="original", p.mat = res_pearson.c_virginica$p[,1:3], sig.level = 0.05, insig = "blank", col=col4(10), tl.pos = "ld", tl.cex = .8, tl.srt=45, tl.col = "black", cl.cex = .8, title = "virginica", mar = c(0,0,2,0)) # 绘图完成后重置布局参数为默认值 par(mfrow = c(1,1), mar = c(5,4,4,2) + 0.1)
注意:如果需要拼接更多分组的相关图,直接修改
par(mfrow = c(行, 列))的参数即可,不需要额外赋值变量。
内容的提问来源于stack exchange,提问作者Rosario
相关产品推荐
相关产品推荐

