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

R语言:如何合并两个geom_bar图表并将数值保留两位小数?

搞定ggplot复合条形图+数值格式化的小技巧

嗨,作为R语言新手遇到这个问题太正常啦!你的需求其实可以通过调整数据格式+ggplot的长数据绘制逻辑来轻松解决,咱们一步步来:

第一步:先把数据处理成ggplot喜欢的样子

你的数据现在是「宽格式」(每一列对应一组数据),但ggplot绘制多组条形图时,更适合用「长格式」(每一行对应一个独立观测)。另外注意哦,你的AA_P1和AB_P1是字符类型(带引号),得先转成数值型才能正常绘图:

# 先加载必备包
library(ggplot2)
library(tidyr) # 用来转换数据格式

# 清洗数据:转数值+转长格式
df_clean <- df %>%
  # 把字符型的数值转成真正的数值型
  mutate(across(c(AA_P1, AB_P1), as.numeric)) %>%
  # 把宽格式转成长格式,方便ggplot识别分组
  pivot_longer(
    cols = -Attribut, # 除了Attribut列,其他列都要转
    names_to = "Category", # 新的分组列名
    values_to = "Value" # 新的数值列名
  )

处理后的数据结构会变成这样(更适合ggplot):

AttributCategoryValue
Text1AA_P10.111
Text1AB_P10.41
Text2AA_P10.32
.........

第二步:绘制复合条形图+保留两位小数的数值标签

现在用处理好的数据来画你想要的合并图表,同时给每个条形加上保留两位小数的数值:

ggplot(df_clean, aes(x = Attribut, y = Value, fill = Category)) +
  # 绘制并列的条形图,width和dodge参数调整间距
  geom_bar(stat = "identity", position = position_dodge(width = 0.8), width = 0.7) +
  # 添加数值标签,round(Value,2)就是保留两位小数
  geom_text(
    aes(label = round(Value, 2)),
    position = position_dodge(width = 0.8), # 和条形对齐
    vjust = -0.5, # 把标签放在条形上方
    size = 3.5
  ) +
  # 手动设置你想要的颜色(对应原来的蓝红)
  scale_fill_manual(values = c("AA_P1" = "blue", "AB_P1" = "red")) +
  # 保持你原来的翻转坐标轴效果
  coord_flip() +
  # 调整轴文本对齐,避免重叠
  theme(axis.text.y = element_text(hjust = 1)) +
  # 给图表加清晰的标签
  labs(x = "Attribute", y = "Value", fill = "Group")

小调整选项:

如果你想要堆叠式的条形图,只需要把position = position_dodge(width = 0.8)改成position = "stack"就行啦!

额外提醒:

要是你暂时不想用tidyr包,也可以用基础R的reshape函数来转长格式,但tidyr的语法会更直观好懂。另外一定要确保数值列是数值型,不然ggplot会把它们当成分类变量,导致绘图出错哦~

内容的提问来源于stack exchange,提问作者Leon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:42:56