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

