You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在ggplot2垂直多图中添加均值并调整X轴刻度

解决Likert图的两个需求实现方法

一、计算并标注年份均值

首先需要根据Likert等级计算每个Year+item组合的加权均值,再将均值标注到对应条形的中间位置:

  1. 给每个Response对应的Likert等级映射数值分数(1到5)
  2. 按Year和item分组,用百分比作为权重计算加权均值
  3. 在绘图时用文本标注工具将均值放置在条形的中心(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:24:50