You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:02:58