在R中用ggplot绘制按年份分组的水平李克特图
按年份分组的水平李克特图绘制方案
实现步骤
要完成需求,需先对数据做分组统计(计算各年份内A类别的占比),再用ggplot2绘制水平堆叠条形图(即水平李克特图),并指定自定义颜色映射。
完整代码
# 加载依赖包 library(dplyr) library(ggplot2) # 生成示例数据 set.seed(123) A <- sample(1:5, 1000, replace = TRUE) year <- sample(c(2019, 2020, 2021, 2022), 1000, replace = TRUE) df <- data.frame(A, year) # 数据预处理:计算各年份内A类别的百分比 df_summary <- df %>% group_by(year, A) %>% summarise(count = n(), .groups = "drop") %>% group_by(year) %>% mutate(percent = count / sum(count) * 100) %>% ungroup() %>% mutate(A = factor(A, levels = 1:5)) # 转为因子保证类别顺序正确 # 绘制水平李克特图 ggplot(df_summary, aes(x = year, y = percent, fill = A)) + geom_col(position = "stack") + # 堆叠条形展示占比 coord_flip() + # 转为水平方向 # 自定义颜色映射 scale_fill_manual(values = c( "1" = "red", "2" = "lightcoral", "3" = "blue", "4" = "lightgreen", "5" = "green" )) + # 添加百分比标签(可选,提升可读性) geom_text(aes(label = sprintf("%.1f%%", percent)), position = position_stack(vjust = 0.5), size = 3) + # 调整坐标轴与标题 labs(x = "年份", y = "百分比", fill = "类别A") + theme_minimal()
代码说明
- 数据处理:通过
dplyr分组统计,先计算每个年份+A类别的频数,再转换为对应年份内的占比;将A转为因子是为了确保绘图时类别按1-5的顺序展示。 - 绘图细节:
geom_col(position = "stack")创建堆叠条形图,直观展示各分类的占比分布。coord_flip()将垂直条形转为水平,符合李克特图的水平展示需求。scale_fill_manual()严格按照要求指定每个A类别的颜色。- 可选的
geom_text()为每个堆叠块添加百分比标签,让数据更直观。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

