You need to enable JavaScript to run this app. 如何在ggplot生成的柱状图上方添加带两位小数的百分比标签
优惠活动
大模型
产品
解决方案
定价
更多

如何在ggplot生成的柱状图上方添加带两位小数的百分比标签

原代码运行异常的核心原因
  • 映射逻辑错位:柱图geom_col的纵轴是基于多边形计数b绘制柱高,但你错误把文本标签的y值设为百分比字段pcent,同时把整个纵轴的刻度标签替换为百分比格式,导致柱高、标签位置、轴刻度三者完全错位——柱体最高对应数值107,却被按百分比刻度规则展示,标签位置也错把百分比数值当成纵轴坐标,自然位置完全偏移。
  • 格式化参数缺失:默认的scales::percent既不会自动保留两位小数,也没有配置逗号作为小数分隔符;另外因为你存入数据框的pcent是已经乘100的百分比数值(比如66.05就代表66.05%),如果不对参数做适配,直接用默认percent函数会把数值再乘100,出现6600%的错误结果。
修正方案实现

两个需求的完整实现逻辑:

  1. 校准标签位置:将文本标签的y值设为对应柱体的高度(b值)加上固定偏移量,把标签放在柱体正上方;纵轴保持原来的计数属性,不再替换为百分比刻度。
  2. 自定义百分比文本格式:利用scales::percent的内置参数适配格式要求:
    • 设置accuracy = 0.01实现保留两位小数
    • 设置decimal.mark = ","把默认的点号小数分隔符替换为逗号
    • 设置scale = 1适配已计算完成的百分比数值,避免重复乘100
  3. 调整纵轴扩展范围,避免顶部标签被画布边界裁切。

可直接运行的修正代码

library(ggplot2)
library(scales)

a <- c("até 50","50-150","150-500","500-2000")
b <- c(107,38,14,3)
pcent <- c(66.049383, 23.456790, 8.641975, 1.851852)
df <- data.frame(a,b,pcent)

ggplot(df, aes(x = reorder(a, -b), y = b)) +
  geom_col(fill = "#70A2E7") +
  # 在柱体正上方添加百分比标签
  geom_text(
    aes(
      y = b + 2, 
      label = percent(
        pcent,
        accuracy = 0.01,
        decimal.mark = ",",
        scale = 1
      )
    ),
    vjust = 0
  ) +
  labs(
    x = "Faixa de desmatamento (ha)",
    y = "Quantidade de polígonos de desmatamento",
    title = "Distribuição dos polígonos de desmatamento"
  ) +
  # 给纵轴顶部预留15%的空间,避免标签被裁切
  scale_y_continuous(expand = expansion(mult = c(0, 0.15)))
最终效果匹配校验
  • 柱体上方可正常显示对应分组的百分比标签,位置对齐柱顶不偏移
  • 标签数值格式为66,05%、23,46%这类符合要求的样式:保留两位小数,使用逗号作为小数分隔符
  • 纵轴刻度正常显示多边形计数的真实数值,不会出现轴刻度与柱高不匹配的错位问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.14 11:24:01