在R中用ggplot2结合李克特图与条形图并匹配水平轴
R中实现排序一致的李克特分面图与条形图
步骤1:准备模拟数据(可替换为你的真实数据)
先构造一个符合需求的测试数据集,方便后续验证:
set.seed(123) # 固定随机种子,确保结果可复现 df <- data.frame( var = LETTERS[1:20], val1 = sample(c("Very Dissatisfied", "Dissatisfied", "Neutral", "Satisfied", "Very Satisfied"), 20, replace = TRUE), val2 = sample(c("Very Dissatisfied", "Dissatisfied", "Neutral", "Satisfied", "Very Satisfied"), 20, replace = TRUE), val3 = sample(c("Very Dissatisfied", "Dissatisfied", "Neutral", "Satisfied", "Very Satisfied"), 20, replace = TRUE) )
步骤2:处理数据,确定排序逻辑
先转换为长格式,再计算每个var的不满意项合计,筛选前10个最不满意的指标并固定顺序:
library(tidyverse) library(ggstats) # 未安装的话先执行:install.packages("ggstats") # 转换为长格式数据 df2 <- df %>% pivot_longer(cols = starts_with("val"), names_to = "item", values_to = "response") # 计算每个var的不满意项合计,取前10并锁定顺序 top10_vars <- df2 %>% group_by(var) %>% summarise(dissat_total = sum(response %in% c("Very Dissatisfied", "Dissatisfied"))) %>% arrange(desc(dissat_total)) %>% slice_head(n = 10) %>% pull(var) # 转为因子类型,固定排序(从最不满意到第10名) ordered_vars <- factor(top10_vars, levels = top10_vars)
步骤3:绘制分面李克特图
可以用ggstats快速生成,也可以用ggplot2手动实现,两种方式都能保证顺序一致:
# 方法1:用ggstats一键生成李克特分面图 likert_plot(df2 %>% filter(var %in% top10_vars), x = var, response = response, facet = var, scales = "free_x") + scale_x_discrete(limits = top10_vars) + ggtitle("Top 10最不满意指标的李克特分布") + theme_minimal() # 方法2:用ggplot2手动实现(无需依赖ggstats) df2 %>% filter(var %in% top10_vars) %>% mutate(var = ordered_vars) %>% ggplot(aes(x = response, fill = response)) + geom_bar(position = "fill") + facet_wrap(~var, ncol = 2) + # 可根据需求调整分面列数 coord_flip() + # 翻转坐标轴提升可读性 scale_fill_brewer(palette = "RdYlGn") + scale_y_continuous(labels = scales::percent) + labs(y = "占比", x = "满意度", title = "Top 10最不满意指标的李克特分布") + theme_minimal()
步骤4:绘制匹配顺序的条形图
基于原始数据计算统计量,用之前锁定的ordered_vars保证水平轴顺序与李克特图完全一致:
# 计算原始数据中每个var的不满意项合计,绘制条形图 df %>% rowwise() %>% mutate(dissat_total = sum(c_across(starts_with("val")) %in% c("Very Dissatisfied", "Dissatisfied"))) %>% ungroup() %>% filter(var %in% top10_vars) %>% mutate(var = ordered_vars) %>% ggplot(aes(x = var, y = dissat_total)) + geom_bar(stat = "identity", fill = "#E63946") + labs(x = "指标", y = "不满意次数合计", title = "Top 10最不满意指标的不满意次数") + theme_minimal()
关键说明
两个图表的var排序都依赖ordered_vars这个因子,因此水平轴(或翻转后的纵轴)的顺序完全匹配,不会出现排序混乱的问题。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

