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

使用geom_tile循环绘制热图并保存时遇问题求助

解决热图绘制的两个问题

问题1:Error: Discrete value supplied to continuous scale

原因

你在生成plot_list时,循环的是colnames(dt)[-1],这包含了第二列j(离散字符列)。而scale_fill_gradient是用于连续数值型数据的色阶,把离散数据传给它就会触发该错误。

解决

只循环数值型的填充列,也就是从第三列开始的列:

colnames(dt)[-c(1,2)]  # 仅取Red、Yellow、Green、Blue、Black列

问题2:ggsave无法正常保存图片

原因

  • 未将ggplot生成的图形对象赋值给变量,ggsave(a, ...)里的a未定义;
  • labs里的fill和title用了.data[[f_var]],这会提取列的数值而非列名,不符合需求。

解决

  1. 将ggplot代码的结果赋值给变量(比如p),然后在ggsave中调用该变量;
  2. 直接用f_var作为图例标题和图标题,因为f_var就是循环的列名。

修正后的完整代码

library(ggplot2)
library(purrr)

dt <- data.frame(
  h = rep(LETTERS[1:7], 7), 
  j = c(rep("A", 7), rep("B", 7), rep("C", 7), rep("D", 7), rep("E", 7), rep("F", 7), rep("G", 7)),
  Red = runif(49, 0, 1),  # 原代码runif(7)会重复7次填充49行,改为runif(49)生成每行独立随机值
  Yellow = runif(49, 0, 1), 
  Green = runif(49, 0, 1),
  Blue = runif(49, 0, 1),
  Black = runif(49, 0, 1)
)

loop = function(df, x_var, y_var, f_var) {
  # 将ggplot对象赋值给变量p
  p <- ggplot(df, aes(x = .data[[x_var]], y = .data[[y_var]], fill = .data[[f_var]])) + 
    geom_tile(color = "black") +
    scale_fill_gradient(low = "white", high = "blue") +
    geom_text(aes(label = round(.data[[f_var]], 2)), color = "black", size = 4) +  # 保留两位小数优化显示
    coord_fixed() +
    theme_minimal() +
    labs(x = "",
         y = "",
         fill = f_var,  # 用列名作为图例标题
         title = paste("热图:", f_var))  # 用列名作为图标题
  
  # 保存图片,传入图形对象p
  ggsave(p, file = paste0("heatmap_", f_var,".png"), device = png, width = 15, height = 15, units = "cm")
  
  # 返回图形对象,方便存入plot_list查看
  return(p)
}

# 仅循环数值填充列
plot_list <- colnames(dt)[-c(1,2)] %>% 
  map( ~ loop(df = dt, 
              x_var = colnames(dt)[1], 
              y_var = colnames(dt)[2], 
              f_var = .x))

# 查看所有生成的热图
plot_list

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:16:04