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

在R的ggplot2中优化Likert图文本并添加左右总计

解决Likert图的三个需求:格式化文本、加粗、添加总计

假设你的数据框df结构类似这样(包含类别和各满意度的百分比值,范围0-1):

df <- data.frame(
  类别 = c("产品A", "产品B", "产品C"),
  非常不满意 = c(0.08, 0.12, 0.05),
  不满意 = c(0.15, 0.18, 0.10),
  一般 = c(0.30, 0.25, 0.35),
  满意 = c(0.32, 0.30, 0.38),
  非常满意 = c(0.15, 0.15, 0.12)
)

步骤1:预处理数据,计算左右总计

先把数据转成适合Likert图的长格式,同时计算每个类别的「不满意总计」和「满意总计」:

library(tidyverse)
library(ggplot2)

# 转长格式并计算总计
df_long <- df %>%
  pivot_longer(-类别, names_to = "满意度", values_to = "百分比") %>%
  group_by(类别) %>%
  mutate(
    不满意总计 = sum(百分比[满意度 %in% c("非常不满意", "不满意")]),
    满意总计 = sum(百分比[满意度 %in% c("满意", "非常满意")])
  ) %>%
  ungroup()

步骤2:绘制Likert图,实现文本格式化和加粗

在geom_text里用sprintf把百分比格式化为0位小数,同时设置fontface = "bold"实现加粗:

p <- ggplot(df_long, aes(x = 类别, y = 百分比, fill = 满意度)) +
  geom_bar(stat = "identity", position = "stack") +
  # 条形内文本:0位小数百分比+加粗
  geom_text(aes(label = sprintf("%.0f%%", 百分比*100)),
            position = position_stack(vjust = 0.5),
            fontface = "bold") +
  coord_flip() +  # 反转坐标轴,符合Likert图常见布局
  theme_minimal()

步骤3:添加左右总计文本

基于预处理好的总计值,用geom_text把总计文本放在条形外侧:

p +
  # 左侧添加「非常不满意+不满意」总计
  geom_text(data = df_long %>% distinct(类别, 不满意总计),
            aes(x = 类别, y = -0.05,
                label = sprintf("不满意总计: %.0f%%", 不满意总计*100)),
            fontface = "bold", hjust = 1) +
  # 右侧添加「满意+非常满意」总计
  geom_text(data = df_long %>% distinct(类别, 满意总计),
            aes(x = 类别, y = 1.05,
                label = sprintf("满意总计: %.0f%%", 满意总计*100)),
            fontface = "bold", hjust = 0)

关键细节调整

  • 如果你的百分比已经是乘以100的数值(比如8而不是0.08),把sprintf里的百分比*100改成百分比即可。
  • 调整y参数的数值可以改变总计文本的位置,避免遮挡条形。
  • 若是对称式Likert图(正负坐标轴),只需把左侧总计的y设为负轴外侧、右侧总计的y设为正轴外侧即可。

内容的提问来源于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.15 07:47:06