如何在 R 中可视化多个分类变量与一个连续变量
How to visualize multiple categorical variables vs one continuous variable in R
假设分类变量是,
- Do_you_smoke -> 是/否
- Do_you_drink -> Yes/No
- Do_you_exercise -> Yes/No
所有 3 个分类变量(Do_you_smoke、Do_you_drink、Do_you_exercise)有 2 个类别是或否。现在我想根据一个连续变量可视化所有这些分类变量说“收入”立即。我如何使用 R 将其可视化?
最好包含一个可重现的数据示例,这样我们就可以确保任何可能的解决方案都适用于您自己的数据结构。但是,根据您的描述,我们应该能够重新创建这样的示例数据集:
set.seed(69)
df <- data.frame(income = runif(1000, 10000, 100000))
df$smoke <- c("Yes", "No")[1 + rbinom(1000, 1, df$income/200000)]
df$drink <- sample(c("Yes", "No"), 1000, TRUE)
df$exercise <- c("No", "Yes")[1 + rbinom(1000, 1, df$income/100000)]
所以我们的数据框包含四列:收入金额以及三个变量中每一个的“是”或“否”:
head(df)
#> income smoke drink exercise
#> 1 57767.86 Yes No Yes
#> 2 79192.70 Yes Yes Yes
#> 3 68132.37 No No No
#> 4 87873.44 Yes No No
#> 5 43199.45 Yes Yes No
#> 6 88188.83 No Yes Yes
要绘制此图,我们需要重塑数据。由于收入各不相同,我们无法获得每个人收入水平的百分比,因此我们必须将收入 cut
分箱。让我们用 10,000 美元的垃圾箱来做到这一点。然后我们需要得到每个收入区间中每个变量的“是”的比例。最后,我们要将数据输出为长格式,以便每个箱子中的每个比例都有自己的行,并根据它代表三个分类变量中的哪一个进行标记。然后我们可以使用 ggplot 绘图。
我们需要加载一些库来帮助我们:
library(dplyr)
library(ggplot2)
library(scales)
library(tidyr)
现在我们的代码如下所示:
df %>%
mutate(income_bracket = cut(income, breaks = 1:10 * 10000)) %>%
group_by(income_bracket) %>%
summarise(exercise = length(which(exercise == "Yes"))/n(),
smoke = length(which(smoke == "Yes"))/n(),
drink = length(which(drink == "Yes"))/n()) %>%
mutate(income = paste(dollar(1:9 * 10000),
dollar(2:10 * 10000), sep = " -\n")) %>%
select(-income_bracket) %>%
pivot_longer(1:3) %>%
ggplot(aes(x = income, y = value, group = name, colour = name)) +
geom_line(size = 1.3) +
geom_point(size = 3) +
scale_y_continuous(labels = percent, limits = c(0, 1)) +
labs(title = "Percentage of activities by income",
y = "Percent", x = "Income bracket", color = "Do you...")
假设分类变量是,
- Do_you_smoke -> 是/否
- Do_you_drink -> Yes/No
- Do_you_exercise -> Yes/No
所有 3 个分类变量(Do_you_smoke、Do_you_drink、Do_you_exercise)有 2 个类别是或否。现在我想根据一个连续变量可视化所有这些分类变量说“收入”立即。我如何使用 R 将其可视化?
最好包含一个可重现的数据示例,这样我们就可以确保任何可能的解决方案都适用于您自己的数据结构。但是,根据您的描述,我们应该能够重新创建这样的示例数据集:
set.seed(69)
df <- data.frame(income = runif(1000, 10000, 100000))
df$smoke <- c("Yes", "No")[1 + rbinom(1000, 1, df$income/200000)]
df$drink <- sample(c("Yes", "No"), 1000, TRUE)
df$exercise <- c("No", "Yes")[1 + rbinom(1000, 1, df$income/100000)]
所以我们的数据框包含四列:收入金额以及三个变量中每一个的“是”或“否”:
head(df)
#> income smoke drink exercise
#> 1 57767.86 Yes No Yes
#> 2 79192.70 Yes Yes Yes
#> 3 68132.37 No No No
#> 4 87873.44 Yes No No
#> 5 43199.45 Yes Yes No
#> 6 88188.83 No Yes Yes
要绘制此图,我们需要重塑数据。由于收入各不相同,我们无法获得每个人收入水平的百分比,因此我们必须将收入 cut
分箱。让我们用 10,000 美元的垃圾箱来做到这一点。然后我们需要得到每个收入区间中每个变量的“是”的比例。最后,我们要将数据输出为长格式,以便每个箱子中的每个比例都有自己的行,并根据它代表三个分类变量中的哪一个进行标记。然后我们可以使用 ggplot 绘图。
我们需要加载一些库来帮助我们:
library(dplyr)
library(ggplot2)
library(scales)
library(tidyr)
现在我们的代码如下所示:
df %>%
mutate(income_bracket = cut(income, breaks = 1:10 * 10000)) %>%
group_by(income_bracket) %>%
summarise(exercise = length(which(exercise == "Yes"))/n(),
smoke = length(which(smoke == "Yes"))/n(),
drink = length(which(drink == "Yes"))/n()) %>%
mutate(income = paste(dollar(1:9 * 10000),
dollar(2:10 * 10000), sep = " -\n")) %>%
select(-income_bracket) %>%
pivot_longer(1:3) %>%
ggplot(aes(x = income, y = value, group = name, colour = name)) +
geom_line(size = 1.3) +
geom_point(size = 3) +
scale_y_continuous(labels = percent, limits = c(0, 1)) +
labs(title = "Percentage of activities by income",
y = "Percent", x = "Income bracket", color = "Do you...")