ggplot数据筛选:跨数据集绘制密度图用subset还是ifelse?
问题:按PPA筛选后在ggplot中绘制两个数据集的密度图
数据集结构
dataset1
Real Wage 1 PPA 1244 105 1577 90 1865 105 1756 105 1634 90 1273 90 2719 105 ... ....
dataset2
Real Wage 2 PPA 1233 105 1588 90 1265 105 1743 105 1224 90 1983 90 2449 105 ... ....
初始可运行代码
ggplot() + geom_density( aes( x = dataset1$`Real Wage 1`), fill = "red", alpha = 0.5)+ geom_density( aes( x = dataset2$`Real Wage 2`), fill = "blue", alpha = 0.5)+ theme_classic()
问题场景
需要按PPA == 105筛选两个数据集的工资变量后绘图,尝试以下代码但无效:
ggplot() + geom_density( aes( x = subset(dataset1$`Real Wage 1`, PPA == 105)), fill = "red", alpha = 0.5)+ geom_density( aes( x = subset(dataset2$`Real Wage 2`, PPA ==105)), fill = "blue", alpha = 0.5)+ theme_classic()
原因是dataset1$Real Wage 1``仅提取了单个列,subset无法找到PPA列作为筛选条件,尝试ifelse也未成功。
解决方案
方法1:直接在图层中对数据集做子集筛选
先对整个数据集按PPA筛选,再提取工资列:
ggplot() + geom_density(aes(x = subset(dataset1, PPA == 105)$`Real Wage 1`), fill = "red", alpha = 0.5)+ geom_density(aes(x = subset(dataset2, PPA == 105)$`Real Wage 2`), fill = "blue", alpha = 0.5)+ theme_classic()
方法2:提前筛选数据(代码更清晰)
先将筛选后的数据集存为新对象,再绘图:
# 提前筛选符合条件的数据 dataset1_filtered <- subset(dataset1, PPA == 105) dataset2_filtered <- subset(dataset2, PPA == 105) # 绘制密度图 ggplot() + geom_density(aes(x = dataset1_filtered$`Real Wage 1`), fill = "red", alpha = 0.5)+ geom_density(aes(x = dataset2_filtered$`Real Wage 2`), fill = "blue", alpha = 0.5)+ theme_classic()
方法3:合并数据集后分组绘图(ggplot推荐方式)
将两个数据集整理为整洁格式,用分组变量区分来源,自动生成图例,更符合ggplot设计逻辑:
library(dplyr) library(tidyr) # 整理为tidy格式数据 tidy_data <- bind_rows( dataset1 %>% filter(PPA == 105) %>% select(wage = `Real Wage 1`) %>% mutate(source = "dataset1"), dataset2 %>% filter(PPA == 105) %>% select(wage = `Real Wage 2`) %>% mutate(source = "dataset2") ) # 绘图 ggplot(tidy_data, aes(x = wage, fill = source)) + geom_density(alpha = 0.5) + scale_fill_manual(values = c("dataset1" = "red", "dataset2" = "blue")) + theme_classic()
内容的提问来源于stack exchange,提问作者io_boh
相关产品推荐
相关产品推荐

