R语言中循环生成树形图后保存文件损坏的解决方法
修复R语言循环保存树形图文件损坏的问题
你的循环代码存在两个核心问题导致PNG文件损坏:
- 调用
png()打开绘图设备后,没有在该设备上绘制图形,也未用dev.off()关闭设备,生成的文件是空的。 - 先在Windows窗口设备绘制了树形图,再打开PNG设备,两者属于独立绘图上下文,PNG设备没有内容写入。
修复后的完整代码
library(treemap) library(dplyr) # 构建数据集(保留原始逻辑) var1 <- c("A", "B", "C", "D", "E") var1 <- sample(var1, 1000, replace=TRUE, prob=c(0.2, 0.2, 0.2, 0.2, 0.2)) var1 <- as.factor(var1) var2 <- c("abc", "bcd", "egf", "hiu", "lkj", "oiu", "piu", "xsr", "zze", "tre") var2 <- sample(var2, 1000, replace=TRUE, prob=c(0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1)) var2 <- as.factor(var2) my_data <- data.frame(var1, var2) %>% group_by(var1, var2) %>% summarise(counts = n(), .groups = "drop") # 添加.groups参数避免dplyr警告 # 获取var1的唯一因子水平(简化代码) factors <- levels(my_data$var1) my_list <- list() for (i in seq_along(factors)) { index_i <- factors[i] title_i <- paste0("Tree Map - ", index_i) data_i <- filter(my_data, var1 == index_i) # 设置PNG输出参数,直接指定宽高(像素单位) save_title_i <- paste0("treemap_", index_i, ".png") # 用因子名命名更直观 png(save_title_i, width = 800, height = 800) # 在PNG设备上绘制树形图,子数据集var1唯一,仅保留var2作为索引 treemap_i <- treemap(data_i, index = "var2", vSize = "counts", type = "index", palette = "Set1", title = title_i) my_list[[i]] <- treemap_i # 关闭PNG设备,完成文件写入 dev.off() }
关键修改说明
- 调整绘图设备顺序:将
png()放在treemap()之前,确保树形图绘制在PNG设备上,最后用dev.off()关闭设备,强制完成文件写入。 - 简化因子水平获取:直接用
levels(my_data$var1)获取唯一因子水平,替代原复杂的lapply逻辑。 - 优化文件名:用因子名(如A、B)命名PNG文件,比数字编号更易识别和管理。
- 精简树形图索引:子数据集的
var1为单一值,仅保留var2作为索引,避免冗余显示。 - 移除
resize.win函数:保存PNG文件无需调整Windows窗口大小,直接通过png()的width和height参数设置输出尺寸。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

