在R中按巴西州(UF)分组绘制多个直方图代码无输出如何解决
R按巴西州分组绘制直方图无输出问题排查与解决方案
核心问题原因
- 绘图数据未按UF筛选:现有代码中
hist()调用的是全量的ENEM$NU_NOTA_MT数据,未筛选对应州的考生成绩,即使出图也只是所有州的重复直方图,仅x轴标签不同 - 循环绘图被覆盖:R默认图形设备会用新图覆盖上一张绘图结果,循环运行结束后仅保留最后一张图,容易产生“无输出”的错觉;非交互环境下运行脚本还可能不会主动触发图形设备渲染,完全看不到绘图结果
- 额外可能原因:
ENEM$NU_NOTA_MT列全为缺失值,或ENEM$SG_UF_RESIDENCIA列无有效取值,导致hist()函数无有效输入无法绘图
解决思路
1. 前置数据校验
先运行以下代码确认基础数据正常:
# 校验数学成绩非缺失值数量,返回为0则说明无有效成绩可绘图 sum(!is.na(ENEM$NU_NOTA_MT)) # 校验UF的唯一值数量,返回应为27 length(unique(ENEM$SG_UF_RESIDENCIA))
2. 修正绘图逻辑与输出方式
根据使用场景选择对应方案:
方案1:单独导出每张直方图到本地文件
循环中每次创建独立的图片文件存储对应州的直方图,避免覆盖,代码示例:
UFs <- unique(ENEM$SG_UF_RESIDENCIA) for(i in UFs){ # 创建对应州的png文件,可自行调整尺寸参数 png(paste0("ENEM数学分直方图_",i,".png"), width = 700, height = 500) # 筛选对应州的非缺失成绩绘图 hist(na.omit(ENEM$NU_NOTA_MT[ENEM$SG_UF_RESIDENCIA == i]), main = "Histograma Nota Matemática ENEM 2017 - 2019", xlab = paste("UF: ", i), ylab = "Frequência", col = "#224e69") # 关闭图形设备完成写入 dev.off() }
运行完成后会在R当前工作目录生成27张对应各州的直方图文件。
方案2:同画布展示所有直方图
将27张图排列在同一画布中,方便直观对比各州分布,代码示例:
UFs <- unique(ENEM$SG_UF_RESIDENCIA) # 设置画布为3行9列,刚好放下27张图,同步调整边距避免标签重叠 par(mfrow = c(3,9), mar = c(1.5,1.5,1.5,0.5)) for(i in UFs){ hist(na.omit(ENEM$NU_NOTA_MT[ENEM$SG_UF_RESIDENCIA == i]), main = i, xlab = NULL, ylab = NULL, col = "#224e69") } # 绘图完成后重置画布参数 par(mfrow = c(1,1))
特殊场景:R Markdown环境
如果在R Markdown文档中运行代码,需要在代码块头部添加{r, fig.keep="all"}参数,才能保留所有循环生成的绘图结果,不会仅输出最后一张。
内容的提问来源于stack exchange,提问作者Victor Resende
相关产品推荐
相关产品推荐

