如何在R语言中绘制中间带有文本的双侧条形图?
在R中实现中间带文本的双侧条形图
完全可以用ggplot2实现这类双侧条形图,无需额外专用工具包,以下是具体实现方案:
步骤1:构造示例数据
先准备包含类别、左右两侧数值的数据集:
library(ggplot2) # 模拟业务数据(替换为你的真实数据即可) df <- data.frame( 类别 = c("用户留存", "付费转化", "内容曝光", "活动参与"), 左侧数值 = c(28, 42, 35, 58), 右侧数值 = c(32, 26, 48, 22) )
步骤2:ggplot2绘图实现
核心思路是将左侧数值转为负数,让条形向左延伸,右侧用正数向右延伸,中间添加类别文本,最后调整样式:
# 将左侧数值转为负数,用于绘制左向条形 df$左侧负数值 <- -df$左侧数值 ggplot(df, aes(y = 类别)) + # 绘制左侧条形 geom_col(aes(x = 左侧负数值), fill = "#4A90E2", width = 0.8) + # 绘制右侧条形 geom_col(aes(x = 右侧数值), fill = "#E24A4A", width = 0.8) + # 添加中间类别文本(替代y轴标签) geom_text(aes(x = 0, label = 类别), size = 5, fontface = "bold", color = "#333333") + # 添加左侧条形的数值标签 geom_text(aes(x = 左侧负数值, label = abs(左侧负数值)), hjust = 1.3, color = "white", size = 4) + # 添加右侧条形的数值标签 geom_text(aes(x = 右侧数值, label = 右侧数值), hjust = -0.3, color = "white", size = 4) + # 调整坐标轴与主题样式 labs(x = NULL, y = NULL) + # 设置x轴范围,给标签留出空间 xlim(-max(df$左侧数值)*1.3, max(df$右侧数值)*1.3) + theme( # 隐藏y轴刻度与文本(中间已有类别文本) axis.text.y = element_blank(), axis.ticks.y = element_blank(), # 去除网格线与背景 panel.grid = element_blank(), panel.background = element_blank(), # 调整x轴文本样式 axis.text.x = element_text(size = 10) )
自定义调整说明
- 若需要修改条形颜色,替换
fill参数的十六进制颜色码即可 - 调整条形宽度修改
width参数 - 数值标签的位置通过
hjust参数微调(左标签hjust>1向右偏移,右标签hjust<0向左偏移) - 若你的参考图有其他样式(比如边框、背景色),可在
theme中添加对应参数调整
关于专用工具包
目前没有专门针对这类双侧条形图的主流工具包,用ggplot2自定义已经足够灵活,能适配绝大多数场景需求。
内容的提问来源于stack exchange,提问作者CristEin
相关产品推荐
相关产品推荐

