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

如何将summary()的结果转换为plot/grob并展示?

解决方法:将汇总统计转换为可嵌入的图形对象

这个问题很常见——grid.arrange只能处理图形对象(grob),而summary()返回的是文本格式的统计结果,不是可渲染的图形元素,所以才会抛出那个错误。这里有几个实用的解决方案,帮你把汇总统计和图表一起展示:

方案1:把汇总统计转换成文本Grob

我们可以用grid包的textGrob()函数,把summary()的结果转换成grid.arrange能识别的图形对象。具体步骤如下:

  1. 把summary()的输出格式成易读的字符串(每行一个统计项)
  2. 用textGrob()将字符串转为图形对象
  3. 把这个grob加入到你的图表列表中

修改后的代码示例:

library(ggplot2) 
library(dplyr) 
library(ggpubr) 
library(ggthemes) 
library(Rmisc) 
library(gridExtra)
library(grid) # 需要加载grid包

myplots <- list() 

# 假设你的特征从第2列到第n列,这里替换成实际的列范围
for (i in seq(2, ncol(dataset))){ 
  local({ 
    i <- i
    var_name <- colnames(dataset)[i]
    
    # 生成直方图
    p1 <- ggplot(data=dataset,aes(x=.data[[var_name]], colour=label))+
      geom_histogram(alpha=.01, position="identity",bins = 33, fill = "white") +
      xlab(var_name) + scale_y_log10() + theme_few()
    
    # 生成箱线图
    p2 <- ggplot(data=dataset, aes(x=label, y=.data[[var_name]], colour=label)) +
      geom_boxplot()+
      ylab(var_name) + theme_few()
    
    # 处理汇总统计,转换为文本grob
    stats_summary <- summary(dataset[,i])
    # 格式化为每行一个统计项的字符串
    stats_text <- paste(names(stats_summary), stats_summary, sep = ": ", collapse = "\n")
    # 创建文本图形对象
    p3 <- textGrob(stats_text, x = 0.5, y = 0.5, just = "center", 
                   gp = gpar(fontsize = 9, lineheight = 1.2))
    
    # 添加到列表(调整索引避免间隔问题)
    idx <- (i-1)*3 + 1
    myplots[[idx]] <<- p1
    myplots[[idx+1]] <<- p2
    myplots[[idx+2]] <<- p3
  }) 
}

# 现在可以正常用grid.arrange展示了
n <- length(myplots) 
nCol <- floor(sqrt(n)) 
do.call("grid.arrange", c(myplots, ncol=nCol))

方案2:将统计量嵌入到对应图表中(更简洁)

如果不想单独展示统计量的块,可以把汇总统计直接添加到箱线图或直方图的空白区域,这样每个特征只需要两个图表(甚至合并成一个),布局更紧凑。

示例代码:

library(ggplot2) 
library(dplyr) 
library(ggpubr) 
library(ggthemes) 
library(gridExtra)

myplots <- list() 

feature_cols <- colnames(dataset)[2:ncol(dataset)] # 提取特征列名

for (var in feature_cols){ 
  # 生成直方图
  p1 <- ggplot(data=dataset,aes(x=.data[[var]], colour=label))+
    geom_histogram(alpha=.01, position="identity",bins = 33, fill = "white") +
    xlab(var) + scale_y_log10() + theme_few()
  
  # 生成带统计量的箱线图
  stats_summary <- summary(dataset[[var]])
  stats_text <- paste(names(stats_summary), stats_summary, sep = ": ", collapse = "\n")
  
  p2 <- ggplot(data=dataset, aes(x=label, y=.data[[var]], colour=label)) +
    geom_boxplot()+
    ylab(var) + theme_few() +
    # 把统计量放在图表顶部中间
    annotate("text", x = median(as.integer(dataset$label)), 
             y = max(dataset[[var]], na.rm=T)*1.1, 
             label = stats_text, hjust = 0.5, fontsize = 8, lineheight = 1.2)
  
  # 把直方图和箱线图合并成一个grob
  combined_plot <- ggarrange(p1, p2, ncol=1, heights = c(2,2))
  myplots[[var]] <- combined_plot
}

# 展示所有组合图
n <- length(myplots) 
nCol <- floor(sqrt(n)) 
do.call("grid.arrange", c(myplots, ncol=nCol))

方案3:分开保存统计量到文本文件

如果不需要把统计量和图表放在同一展示页,可以单独把所有特征的汇总统计导出到文本文件,只展示图表:

# 导出统计量到文本文件
sink("feature_summary_stats.txt")
cat("Dataset Feature Summary Statistics\n")
cat("=================================\n\n")
for (i in seq(2, ncol(dataset))){
  var_name <- colnames(dataset)[i]
  cat("Feature:", var_name, "\n")
  print(summary(dataset[,i]))
  cat("\n---------------------------------\n")
}
sink()

# 只展示直方图和箱线图
myplots <- list() 
for (i in seq(2, ncol(dataset))){ 
  local({ 
    i <- i
    var_name <- colnames(dataset)[i]
    
    p1 <- ggplot(data=dataset,aes(x=.data[[var_name]], colour=label))+
      geom_histogram(alpha=.01, position="identity",bins = 33, fill = "white") +
      xlab(var_name) + scale_y_log10() + theme_few()
    
    p2 <- ggplot(data=dataset, aes(x=label, y=.data[[var_name]], colour=label)) +
      geom_boxplot()+
      ylab(var_name) + theme_few()
    
    myplots[[(i-1)*2 +1]] <<- p1
    myplots[[(i-1)*2 +2]] <<- p2
  }) 
}

n <- length(myplots) 
nCol <- floor(sqrt(n)) 
do.call("grid.arrange", c(myplots, ncol=nCol))

额外优化建议

  • 用purrr包的map()函数代替for循环,代码更简洁,避免全局赋值的问题
  • 给每个组合图添加标题,方便快速识别对应特征
  • 调整grid.arrange的ncol和heights参数,让整体展示更美观

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:05:59