在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
相关产品推荐
相关产品推荐

