如何用ggplot同时可视化三个分类变量?需展示处理组差异
解决方案
要展示处理组(treatment)和对照组(control)的差异,核心是在数据统计和可视化环节把group变量纳入逻辑中,以下是修正后的代码:
修正后代码
library(tidyverse) library(scales) socio_egotropic_graph |> drop_na() |> filter(socio_egotropic != "N/A") |> select(socio_egotropic, treatment_details, group) |> # 按三个变量分组统计数量,确保每个组-时间-取向的计数正确 group_by(group, treatment_details, socio_egotropic) |> tally() |> ungroup() |> # 按组和处理前后计算各取向的占比 group_by(group, treatment_details) |> mutate(socio_egotropic_percentage = n / sum(n)) |> mutate(across(c(socio_egotropic, treatment_details, group), as.factor)) |> ggplot(aes(x = treatment_details, y = socio_egotropic_percentage, fill = socio_egotropic)) + geom_bar(stat = "identity", position = position_dodge(preserve = "single")) + # 按处理组/对照组分面展示,清晰对比两组差异 facet_wrap(~group) + scale_y_continuous(labels = percent_format(accuracy = 1)) + labs( x = "处理阶段(前/后)", y = "观点取向占比", fill = "观点取向", title = "处理组与对照组的观点取向对比(处理前后)" ) + theme_bw() + theme( text = element_text(size = 10), plot.title = element_text(size = 10, face = "bold") )
关键改动说明
- 数据统计环节:将
group加入分组逻辑,先按group,treatment_details,socio_egotropic统计每个细分组的数量,再按group和treatment_details计算占比,确保占比是组内的相对比例,而非全局比例。 - 可视化环节:使用
facet_wrap(~group)将处理组和对照组的图表分开展示,直观对比两组在处理前后的取向变化;也可以选择将x设为interaction(treatment_details, group),把组和处理阶段合并为x轴类别,在同一图表中对比。
替代可视化方案
如果不想用分面,也可以把group作为x轴的分组维度,代码调整如下:
# 替代方案:同一图表中展示组和处理阶段的组合 ggplot(aes(x = interaction(treatment_details, group), y = socio_egotropic_percentage, fill = socio_egotropic)) + geom_bar(stat = "identity", position = position_dodge(preserve = "single")) + scale_y_continuous(labels = percent_format(accuracy = 1)) + scale_x_discrete(labels = c("处理前-对照组", "处理前-处理组", "处理后-对照组", "处理后-处理组")) + labs( x = "分组与处理阶段", y = "观点取向占比", fill = "观点取向", title = "处理组与对照组的观点取向对比" ) + theme_bw() + theme( text = element_text(size = 10), plot.title = element_text(size = 10, face = "bold"), axis.text.x = element_text(angle = 45, hjust = 1) )
内容的提问来源于stack exchange,提问作者nesta1990
相关产品推荐
相关产品推荐

