使用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]],这会提取列的数值而非列名,不符合需求。
解决
- 将ggplot代码的结果赋值给变量(比如
p),然后在ggsave中调用该变量; - 直接用
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
相关产品推荐
相关产品推荐

