如何在R语言中将两个数据框的数据绘制成堆叠柱状图?
实现男女新冠感染数据的堆叠柱状图并解决报错
问题说明
现有两个数据框:
dbDateSubMSortNacional:存储女性新冠感染数据,含fecha(日期)、total(当日感染数)字段dbDateSubHSortNacional:存储男性新冠感染数据,字段结构与上述一致
已分别绘制单性别柱状图,需合并为堆叠柱状图;尝试他人方案时出现报错:Error in cbind(total.2022 - 1 - 10, total.2022 - 1 - 11, total.2022 - : object 'total.2022' not found
报错原因分析
提供的错误代码存在两处致命问题:
- 错误将日期格式(如
2022-01-10)拆解为变量名+减法运算(total.2022-01-10被解析为total.2022减去1再减去10),但不存在名为total.2022的对象 - 数据结构逻辑混乱,未正确关联性别与感染数的对应关系
正确实现步骤(基于基础R)
1. 数据预处理:合并并整理为适合堆叠图的格式
先给两个数据框的total列重命名以区分性别,再按日期合并,提取前5天数据(与你之前的绘图范围一致):
# 可复现数据 fecha <- c("2022-01-01","2022-01-02","2022-01-03", "2022-01-04", "2022-01-05", "2022-01-06", "2022-01-07") total <- c(1, 3, 5, 7, 9, 11, 13) dbDateSubMSortNacional <- data.frame(fecha, total) total <- c(2, 4, 6, 8, 10, 12, 14) dbDateSubHSortNacional <- data.frame(fecha, total) # 重命名列并合并 names(dbDateSubMSortNacional)[2] <- "total_mujer" names(dbDateSubHSortNacional)[2] <- "total_hombre" combined_data <- merge(dbDateSubMSortNacional, dbDateSubHSortNacional, by = "fecha") # 提取前5天数据 top5_data <- combined_data[1:5, ]
2. 绘制堆叠柱状图
将性别感染数转为矩阵,传入barplot(默认生成堆叠图),同时添加标题、坐标轴标签、数值标注和图例:
# 准备堆叠用的矩阵:行是日期,列是性别 stack_matrix <- as.matrix(top5_data[, c("total_mujer", "total_hombre")]) # 绘制堆叠柱状图 bar_pos <- barplot(stack_matrix, names.arg = top5_data$fecha, cex.names = 0.759, cex.axis = 1, main = "Contagios por género (5 días)", xlab = "Fechas yy-mm-dd", ylab = "Número de contagios", col = c("#FF6B6B", "#4ECDC4"), # 自定义性别颜色(替换rainbow也可) border = "white", ylim = c(0, 30)) # 根据实际数据调整上限 # 添加数值标签:分别标注女性和男性的数值 text(bar_pos, top5_data$total_mujer/2, labels = top5_data$total_mujer) text(bar_pos, top5_data$total_mujer + top5_data$total_hombre/2, labels = top5_data$total_hombre) # 添加图例 legend("topright", legend = c("Femenino", "Masculino"), fill = c("#FF6B6B", "#4ECDC4"), cex = 0.8)
代码说明
barplot接收矩阵时,自动将每列作为堆叠层- 数值标签的位置计算:女性标签在自身柱子的中点(
total_mujer/2),男性标签在女性柱子顶部加上自身柱子的中点(total_mujer + total_hombre/2) - 可根据需求调整颜色、ylim范围等参数
内容的提问来源于stack exchange,提问作者slow_learner
相关产品推荐
相关产品推荐

