R语言:按组合维度排序Likert层级并匹配分组条形图
解决方案
以下是基于ggplot2和ggstats实现需求的完整代码,包含数据预处理、排序逻辑和图形对齐的细节:
1. 加载依赖包与生成模拟数据
library(ggplot2) library(ggstats) library(dplyr) library(tidyr) library(patchwork) # 生成模拟Likert数据(固定随机种子保证可复现) set.seed(123) dat <- simulate_likert( n = 500, items = paste0("q", 1:6), grouping = sample(c("Group A", "Group B", "Group C"), 500, replace = TRUE, prob = c(0.4, 0.35, 0.25)) )
2. 实现分组排序(按计数降序)
先统计每个分组的样本量,以此为依据将grouping转换为有序因子:
# 获取分组的降序排序规则 group_order <- dat %>% count(grouping) %>% arrange(desc(n)) %>% pull(grouping) # 将grouping转为有序因子 dat$grouping <- factor(dat$grouping, levels = group_order)
3. 实现分面内问题排序(按同意类占比降序)
计算每个分组下各问题的「Strongly agree+Agree」占比,据此为每个分组内的问题设定排序规则:
# 计算每个分组-问题组合的同意类占比,生成排序索引 item_order <- dat %>% pivot_longer(cols = starts_with("q"), names_to = "item", values_to = "response") %>% mutate(is_agree = response %in% c("Strongly agree", "Agree")) %>% group_by(grouping, item) %>% summarise(agree_pct = mean(is_agree), .groups = "drop") %>% arrange(grouping, desc(agree_pct)) %>% group_by(grouping) %>% mutate(item_rank = row_number()) %>% ungroup() # 将问题转为带分组内排序的因子 dat_long <- dat %>% pivot_longer(cols = starts_with("q"), names_to = "item", values_to = "response") %>% left_join(item_order, by = c("grouping", "item")) %>% mutate(item = reorder_within(item, -item_rank, grouping))
4. 绘制Likert图与计数条形图并对齐
使用patchwork包实现两个图的水平对齐,通过宽度比例调整布局:
# 绘制分面Likert图 likert_plot <- gglikert(dat_long, item ~ response | grouping) + scale_x_reordered() + # 应用分组内的问题排序规则 labs(x = NULL, y = NULL) + theme(strip.text = element_text(size = 12), panel.spacing = unit(1, "lines")) # 绘制分组计数条形图(翻转坐标匹配Likert图的分组顺序) count_plot <- dat %>% count(grouping) %>% ggplot(aes(x = grouping, y = n)) + geom_bar(stat = "identity", fill = "#2c3e50") + coord_flip() + labs(x = NULL, y = "样本量") + scale_x_discrete(limits = rev(group_order)) + # 反转顺序匹配Likert图的分面顺序 theme_minimal() + theme(axis.text.y = element_text(size = 12)) # 水平拼接两个图,设置宽度比例 count_plot + likert_plot + plot_layout(widths = c(1, 3))
关键细节说明
reorder_within()+scale_x_reordered():实现了分面内独立排序,确保每个分组的问题都按自身同意类占比降序排列- 计数条形图使用
rev(group_order)反转x轴顺序,保证和Likert图的分面行顺序完全匹配 patchwork的plot_layout()通过宽度比例控制两个图的占比,实现视觉上的对齐
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

