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

如何在R语言不用ggplot的基础条形图上显示每个柱子的数值

优化方案

你遇到的标签杂乱问题,主要是固定偏移量不适配不同高度的柱子、字体过大、没有做对齐适配导致的,按以下步骤修改即可:

  1. 先接收barplot()的返回值,这个返回值就是每个柱子的中心横坐标,是后续加标签的基础
  2. 动态调整标签的垂直位置,避免固定偏移量导致的错位
  3. 缩小标签字体,同时对数值做千分位格式化,提升可读性
  4. 对高度极低的柱子(比如Storm天气的租赁量)单独调整标签位置,避免被遮挡

修改后完整代码

res <- data.frame( aggregate( rentals ~ weatherCond + season, bikes, sum ))

res$weatherCond <- ordered(res$weatherCond,
levels = c(1, 2, 3, 4),
labels = c("Clear", "Fog", "Snow", "Storm"))

res$season <- factor(res$season,
levels = c(1, 2, 3, 4),
labels = c("Winter", "Spring", "Summer", "Autumn"))

par(mar=c(10,4,2,1)+.5) 
# 存储barplot的返回值作为每个柱子的中心横坐标
b <- barplot(res[,"rentals"], names=apply( res[,1:2], 1, function(x) paste0(x[1],"_",x[2]) ), las=3, main = "Weather and Rentals", ylab = "Rentals", col = c('blue', 'red', 'green', 'grey')[res$weatherCond])

y <- res$rentals
text(
  x = b,
  # 高度大于100的标签放在柱子内部靠上位置,小于等于100的放在柱子上方避免遮挡
  y = ifelse(y > 100, y * 0.9, y + max(y)*0.01),
  labels = format(y, big.mark = ","), # 给数值加千分位分隔,提升可读性
  cex = 0.7, # 调整字体大小,避免挤在一起
  adj = c(0.5, 1) # 控制文字对齐,避免偏移
)

如果想要所有标签都放在柱子顶端,把上述代码中y的赋值改成y = y + max(y)*0.01即可,动态偏移量会适配不同的数值范围,不会出现高柱子标签挤在一起、矮柱子标签看不到的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:54:05