我正在尝试将来自 2 个不同数据集的两个不同变量的两个密度图绘制在一起。
我的数据集是这样的:
数据集1
Real Wage 1 PPA
1244 105
1577 90
1865 105
1756 105
1634 90
1273 90
2719 105
... ....
数据集2
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()
效果很好,但现在我想根据
Real Wage 1
的特定值绘制
Real Wage 2
和
PPA
的观察结果
当然我不能使用
filter
函数,因为我正在处理两个不同的数据集。
因此,我尝试对每个变量进行子集
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()
但它不起作用,因为(我想 ..)用
$
指定变量我已经排除了所有其他变量,因此子集找不到 PPA
来应用逻辑条件。
我知道可以使用函数
ifelse
过滤数据,但直到现在每次我尝试使用它,它都没有用(可能是因为我无法应用它)。
有人能帮帮我吗?
ggplot 期望使用数据框而不是向量,并且您还错误地使用了
subset
函数。
这样做的方法是在您的 geom_density 条款中使用以下表格...
+ geom_density(data = subset(dataset1, PPA==105), aes(x = `Real Wage 1`), ...)
如果将数据合并到单个长格式数据框中,使用 ggplot 会更容易。例如,您可以按如下方式组合两个数据集:
library(tidyverse)
combined_data <- dataset2 %>%
rename(`Real Wage` = `Real Wage 2`) %>%
bind_rows(rename(dataset1, `Real Wage` = `Real Wage 1`), .id = "dataset") %>%
mutate(dataset = paste("Real Wage", dataset))
combined_data
#> dataset Real Wage PPA
#> 1 Real Wage 1 1233 105
#> 2 Real Wage 1 1588 90
#> 3 Real Wage 1 1265 105
#> 4 Real Wage 1 1743 105
#> 5 Real Wage 1 1224 90
#> 6 Real Wage 1 1983 90
#> 7 Real Wage 1 2449 105
#> 8 Real Wage 2 1244 105
#> 9 Real Wage 2 1577 90
#> 10 Real Wage 2 1865 105
#> 11 Real Wage 2 1756 105
#> 12 Real Wage 2 1634 90
#> 13 Real Wage 2 1273 90
#> 14 Real Wage 2 2719 105
请注意,所有“实际工资”值都在一列中,所有
PPA
值都在一列中,还有一个新列告诉我们每一行属于哪个“实际工资”数据集。
这意味着我们只需要过滤一次数据,并使代码更容易更改。如果我们将数据集列映射到
fill
美学,我们还会“免费”获得图例。我们可以使用 scale_fill_manual
指定我们想要的特定颜色。这样做可以让图例和情节很好地协同工作:
ggplot(filter(combined_data, PPA == 105), aes(x = `Real Wage`, fill = dataset)) +
geom_density(alpha = 0.5) +
scale_fill_manual(values = c("gold", "deepskyblue")) +
theme_minimal(base_size = 20)
还请注意,与其过滤
PPA
并为每个图创建一个图,您可以使用 facet_grid
并同时完成所有操作,如果您的数据是这样设置的:
ggplot(combined_data, aes(`Real Wage`, fill = dataset)) +
geom_density(alpha = 0.5) +
scale_fill_manual(values = c("gold", "deepskyblue")) +
facet_grid(.~PPA) +
theme_minimal(base_size = 16)
创建于 2023-02-26 与 reprex v2.0.2
不是使用 $ 对变量进行子集化,您可以在将它们传递给 ggplot() 之前对整个数据帧进行子集化。这是一个例子:
library(dplyr)
library(ggplot2)
# Subset the data frames by PPA
dataset1_subset <- dataset1 %>% filter(PPA == 105)
dataset2_subset <- dataset2 %>% filter(PPA == 105)
# Combine the subsets into a single data frame
combined <- rbind(
data.frame(dataset = "dataset1", value = dataset1_subset$`Real Wage 1`),
data.frame(dataset = "dataset2", value = dataset2_subset$`Real Wage 2`)
)
# Plot the densities with different colors for each dataset
ggplot(combined, aes(x = value, fill = dataset)) +
geom_density(alpha = 0.5) +
scale_fill_manual(values = c("red", "blue")) +
theme_classic()
此代码首先使用 dplyr 包中的 filter() 通过 PPA == 105 对 dataset1 和 dataset2 进行子集化。然后它将子集组合成一个使用 rbind() 组合的数据框。最后,它将 combined 传递给 ggplot() 并将值映射到 x 轴,将数据集映射到填充颜色。 scale_fill_manual() 函数用于将数据集 1 和数据集 2 的填充颜色分别设置为红色和蓝色。