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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:45:40