在ggplot2垂直多图中添加均值并调整X轴刻度
解决Likert图的两个需求实现方法
一、计算并标注年份均值
首先需要根据Likert等级计算每个Year+item组合的加权均值,再将均值标注到对应条形的中间位置:
- 给每个
Response对应的Likert等级映射数值分数(1到5) - 按
Year和item分组,用百分比作为权重计算加权均值 - 在绘图时用文本标注工具将均值放置在条形的中心(X轴0点位置)
二、设置X轴刻度为100-50-0-50-100
由于position_likert()会将负面倾向的百分比映射到X轴负方向、正面倾向映射到正方向,因此需要指定X轴的刻度位置和显示文本,确保刻度显示为需求的样式。
完整代码实现
library(tidyverse) library(ggstats) # 预处理:计算每个Year+item的Likert加权均值 mean_data <- data_f %>% # 给Likert等级映射分数 mutate(response_score = case_when( Response == "1-Strongly disagree" ~ 1, Response == "2-Disagree" ~ 2, Response == "3-so-so" ~ 3, Response == "4-Agree" ~ 4, Response == "5-Strongly agree" ~ 5 )) %>% group_by(Year, item) %>% summarise(likert_mean = sum(response_score * Percentage / 100), .groups = "drop") # 绘制带需求功能的Likert图 data_f %>% ggplot(aes(Percentage, Year, fill = Response)) + geom_col(position = ggstats::position_likert()) + # 添加均值标注,固定在X轴0点(条形中间) geom_text(data = mean_data, aes(x = 0, label = round(likert_mean, 1)), color = "black", fontface = "bold") + # 设置X轴刻度与显示文本 scale_x_continuous( breaks = c(-100, -50, 0, 50, 100), labels = c("100", "50", "0", "50", "100"), limits = c(-100, 100), labels = ggstats::label_percent_abs() ) + scale_fill_brewer(type = "div", palette = "RdYlGn") + facet_wrap(~item, dir = "v") + theme_bw()
关键代码说明
- 均值计算:通过
case_when完成Likert等级到数值的映射,加权均值公式sum(response_score * Percentage / 100)确保结果反映各等级的占比权重,保留1位小数让标注更简洁。 - 均值标注:使用单独的均值数据集
mean_data,指定x=0定位到条形中心,避免与原始数据的坐标冲突。 - X轴设置:
breaks参数对应实际坐标位置(负数值对应左侧百分比),labels参数设置显示的文本,limits固定轴范围防止刻度偏移。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

