R语言绘制镜像直方图:处理NA值且不丢失var2全部有效数据
镜像直方图缺失值适配方案
核心思路是断开两个图层的数据源依赖,给每个直方图单独指定数据源,避免var1的NA过滤逻辑影响var2的全量数据计算,不需要修改原始数据的NA值。
依赖包准备
# 未安装对应包可先执行安装 # install.packages("ggplot2") # install.packages("hrbrthemes") library(ggplot2) library(hrbrthemes)
修正后绘图代码
p <- ggplot() + # var1图层仅使用var1非空的行,保留全部100个有效值 geom_histogram(data = data[!is.na(data$var1), ], aes(x = var1, y = ..density..), fill="#69b3a2", bins = 30) + geom_label(aes(x=4.5, y=0.25, label="variable1"), color="#69b3a2") + # var2图层使用全量数据集,1000条数据全部参与计算 geom_histogram(data = data, aes(x = var2, y = -..density..), fill= "#404080", bins = 30) + geom_label(aes(x=4.5, y=-0.25, label="variable2"), color="#404080") + theme_ipsum() + xlab("value of x") p
代码中的bins参数可根据需要调整直方图的柱数,获得更符合预期的视觉效果。
原代码问题说明
之前的代码将含NA的完整数据集作为全局数据源传入ggplot,图层默认继承全局数据时,会自动剔除所有存在任意变量缺失的行,导致var2的直方图也仅用到了和var1非NA匹配的100条数据。修改后每个图层单独指定数据源,互不影响:
- var1的直方图仅过滤自身的NA值,全部有效值参与密度计算
- var2的直方图使用全量数据,不受var1的NA干扰
- 全程没有修改原始数据的NA值,最终得到的分布形态和两个变量单独绘图的结果完全一致
内容的提问来源于stack exchange,提问作者Ruser-lab9
相关产品推荐
相关产品推荐

