如何在R语言堆叠柱状图中添加并自动生成标签
垂直柱状图年份显示与数据标签修复方案
你需要将水平柱状图改为垂直版本,并实现年份显示和数据标签自动生成,以下是修正后的代码及说明:
counts <- structure(list( A = c(201,70), B = c(191,66), C = c(197,69), D = c(206,73), E = c(207,73), F = c(212,75), G = c(207,70)), .Names = c("2016", "2017", "2018", "2019", "2020", "2021", "2022"), class = "data.frame", row.names = c(NA, -2L)) print(counts) # 绘图参数设置 colors <- c("paleturquoise3","sienna3") # 计算垂直堆叠子柱的中心y坐标 yFun <- function(x) x/2 + c(0, cumsum(x)[-length(x)]) par(mar=c(5, 4, 4, 2) + 0.1) # 调整底部边距容纳年份标签 # 绘制垂直堆叠柱状图,byc保存柱子的x坐标位置 byc <- barplot(as.matrix(counts), horiz=FALSE, col=colors, border=FALSE, las=1, main="Mean Time Loss by Companies due to Data Breaches", ylim = c(0, 300), width = 1, xlab = "年份") # 添加x轴年份标签 axis(1, at = byc, labels = colnames(counts), cex.axis=0.9) # 生成数据标签的坐标和内容 labs <- data.frame( x = rep(byc, each=nrow(counts)), # 每个分组的x坐标 y = as.vector(sapply(counts, yFun)), # 每个子柱的中心y坐标 labels = as.vector(t(counts)), # 提取所有数据值作为标签 stringsAsFactors=FALSE ) # 添加数据标签到图中 invisible(sapply(seq(nrow(labs)), function(i) { text(x=labs$x[i], y=labs$y[i], labels=labs$labels[i], cex=.8, font=2, col="white") })) # 添加图例 legend("top", legend=c("Mean time to identify (days)","Mean time to contain (days)"), fill=colors, horiz = TRUE, bty='n', border = FALSE)
关键修改说明:
- 年份显示修复:移除
xaxt='n'限制,用axis()在x轴对应柱子位置添加年份标签,同时调整底部边距确保标签完整显示。 - 数据标签位置修正:垂直柱状图坐标逻辑与水平图相反,重新编写
yFun计算子柱的中心y坐标,x坐标复用柱子的位置byc。 - 标签提取优化:通过转置数据提取标签,修正原代码的语法错误,将标签设为白色,确保在有色柱子上清晰可见。
- 边距与参数调整:修改
mar参数适配垂直图布局,移除无效的xlim设置。
内容的提问来源于stack exchange,提问作者Data and AI Nerd
相关产品推荐
相关产品推荐

