如何在R中对齐并列李克特图与分类计数条形图
解决y轴分类对齐的方案
核心是保证两个图的y轴因子顺序完全一致,再通过拼接工具严格对齐。以下是具体代码步骤:
1. 统一筛选前10个分类并固定因子顺序
先从原数据框df中提取你用来绘制李克特图的前10个分类,将var转换为固定顺序的因子,确保两个图的y轴顺序绑定:
# 示例:按总响应计数筛选前10个分类,可替换为你实际的筛选逻辑 top10_vars <- df %>% count(var, sort = TRUE) %>% slice(1:10) %>% pull(var) # 生成筛选后的数据集,固定var的因子水平顺序(反转适配水平图的y轴方向) df_top10 <- df %>% filter(var %in% top10_vars) %>% mutate(var = factor(var, levels = rev(top10_vars)))
2. 绘制水平李克特图
基于固定顺序的数据集绘制,可保留你原有的自定义设置:
library(ggstats) library(ggplot2) likert_plot <- ggplot(df_top10, aes(y = var, x = val1)) + geom_likert() + # 自定义主题/标题等设置 theme(axis.title.y = element_blank()) # 先去掉y轴标题,避免拼接后重复
3. 绘制计数条形图
同样使用固定顺序的var作为y轴,去掉重复的y轴文本:
count_plot <- df_top10 %>% count(var) %>% ggplot(aes(y = var, x = n)) + geom_col(fill = "#6366F1") + labs(x = "响应计数") + theme(axis.title.y = element_blank(), axis.text.y = element_blank()) # 隐藏计数图的y轴文本,避免重复
4. 拼接并强制对齐
用ggpubr或patchwork实现对齐拼接:
用ggpubr的方式:
library(ggpubr) ggarrange(likert_plot, count_plot, widths = c(3, 1), # 调整两图宽度比例 align = "v", # 强制垂直对齐y轴 common.legend = FALSE)
用patchwork的方式:
library(patchwork) likert_plot + count_plot + plot_layout(widths = c(3, 1), align = "v")
关键注意事项
- 两个图的
var必须是完全相同顺序的因子,不能用默认的字母排序,否则对齐会混乱。 - 拼接时必须设置
align = "v",确保y轴刻度和分类完全对齐。 - 隐藏其中一个图的y轴文本和标签,避免重复显示。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

