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):
| Attribut | Category | Value |
|---|---|---|
| Text1 | AA_P1 | 0.111 |
| Text1 | AB_P1 | 0.41 |
| Text2 | AA_P1 | 0.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
相关产品推荐
相关产品推荐

