如何在R语言不用ggplot的基础条形图上显示每个柱子的数值
优化方案
你遇到的标签杂乱问题,主要是固定偏移量不适配不同高度的柱子、字体过大、没有做对齐适配导致的,按以下步骤修改即可:
- 先接收
barplot()的返回值,这个返回值就是每个柱子的中心横坐标,是后续加标签的基础 - 动态调整标签的垂直位置,避免固定偏移量导致的错位
- 缩小标签字体,同时对数值做千分位格式化,提升可读性
- 对高度极低的柱子(比如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
相关产品推荐
相关产品推荐

