如何用ggstats包的gglikert按Region和Dimension可视化多维度调查数据
解决ggstats::gglikert按Region和Dimension分组/分面的问题
要实现按Region和Dimension分组或分面的李克特图,核心是先把你的宽格式数据转换为gglikert要求的长格式,再通过分面或分组参数实现需求。以下是具体步骤:
1. 数据格式转换(关键步骤)
你的数据是宽格式(每个李克特选项为单独列,如strong_agree),而gglikert需要长格式数据(一列存响应类型,一列存对应计数)。用tidyr::pivot_longer完成转换:
library(tidyr) library(ggstats) library(ggplot2) # 替换cols里的列名为你实际的李克特选项列 df_long <- df %>% pivot_longer( cols = c(strong_agree, agree, neutral, disagree, strong_disagree), names_to = "Response", values_to = "Count" )
2. 规范李克特选项的顺序
李克特选项是有序分类,必须转为有序因子,否则图中响应顺序会混乱:
# 按逻辑顺序定义响应级别(可根据你的实际选项调整) response_levels <- c("strong_disagree", "disagree", "neutral", "agree", "strong_agree") df_long$Response <- factor(df_long$Response, levels = response_levels, ordered = TRUE)
3. 实现分面/分组可视化
情况1:按Region和Dimension双维度分面
用facet_grid实现行/列分面,可根据需求调整Region ~ Dimension的顺序(行是Region,列是Dimension):
gglikert(df_long, x = Question, y = Response, weight = Count) + facet_grid(Region ~ Dimension) + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转x轴标签避免重叠
情况2:按Region分组,Dimension分面
如果需要在同一个子图里对比不同Region的结果,用color和fill参数分组,再按Dimension分面:
gglikert(df_long, x = Question, y = Response, weight = Count, color = Region, fill = Region) + facet_wrap(~Dimension, ncol = 2) + # 控制分面列数 theme(axis.text.x = element_text(angle = 45, hjust = 1)) + labs(color = "地区", fill = "地区") # 自定义图例标题
常见问题排查
- 确保
weight = Count参数正确传递:你的数据是计数格式,必须通过weight告诉gglikert每个响应的样本量,否则会把每行当成单个回答,导致结果错误。 - 检查是否有缺失值:如果
Count列有NA,可先用df_long <- df_long %>% filter(!is.na(Count))清理。 - 确认
Question列的每个条目对应唯一的Dimension-Region组合,避免重复数据导致计数异常。
内容的提问来源于stack exchange,提问作者SaoCricalho
相关产品推荐
相关产品推荐

