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

R堆叠柱状图标签小数优化:解决percent对象未找到报错

堆叠柱状图百分比标签优化及报错解决

问题背景

现有如下数据用于绘制堆叠柱状图:

Scenario Losses      Model   percent
1 Scenario 1  23221   Upstream 0.6095231
2 Scenario 1  14876 Downstream 0.3904769
3 Scenario 2    722   Upstream 0.3764338
4 Scenario 2   1196 Downstream 0.6235662
5 Scenario 3  28487   Upstream 0.7256355
6 Scenario 3  10771 Downstream 0.2743645

使用以下代码绘图时,柱子内的百分比标签小数位数过多:

ggplot(test, aes(x = Scenario, y = percent, fill = Model, label = paste(percent * 100, "%", sep = ""))) + 
  geom_bar(stat = "identity", position = "fill", color = "black", alpha=0.8)+
  theme_bw()+
  scale_fill_manual(values = c("#00008B", "#800080"))+ 
  geom_text(position = position_stack(vjust = 0.5), size = 2)

尝试添加以下代码优化时出现报错:

scale_y_continuous(label = scales::percent(percent, accuracy=0.1))

报错信息:

Error in number(x = x, accuracy = accuracy, scale = scale, prefix = prefix,  : 
  object 'percent' not found

报错原因与解决方法

1. 报错原因

scale_y_continuous的labels参数中,scales::percent()不需要手动传入数据列名(如percent),该函数会自动接收ggplot传递的y轴数值进行格式化,传入列名会导致函数无法识别该对象。

2. 完整优化代码

要同时优化y轴刻度和柱子内的标签小数位数,可使用以下代码:

library(ggplot2)
library(scales)

ggplot(test, aes(x = Scenario, y = percent, fill = Model)) + 
  geom_bar(stat = "identity", position = "fill", color = "black", alpha=0.8)+
  theme_bw()+
  scale_fill_manual(values = c("#00008B", "#800080"))+ 
  # 优化y轴刻度为带1位小数的百分比
  scale_y_continuous(labels = percent(accuracy = 0.1)) +
  # 优化柱子内的标签,格式化后保留1位小数
  geom_text(aes(label = percent(percent, accuracy = 0.1)), 
            position = position_stack(vjust = 0.5), size = 2)

关键说明

  • y轴刻度优化:scale_y_continuous(labels = percent(accuracy = 0.1)) 直接传递percent函数,ggplot会自动将y轴的小数转换为带1位小数的百分比格式。
  • 柱子标签优化:geom_text的label参数改用percent(percent, accuracy = 0.1),直接对数据框中的percent列进行格式化,避免手动拼接文本导致的小数位数冗余问题。

如果不想加载scales包,可使用完整函数名:

ggplot(test, aes(x = Scenario, y = percent, fill = Model)) + 
  geom_bar(stat = "identity", position = "fill", color = "black", alpha=0.8)+
  theme_bw()+
  scale_fill_manual(values = c("#00008B", "#800080"))+ 
  scale_y_continuous(labels = scales::percent(accuracy = 0.1)) +
  geom_text(aes(label = scales::percent(percent, accuracy = 0.1)), 
            position = position_stack(vjust = 0.5), size = 2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 12:53:29