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

如何在R语言中将两个数据框的数据绘制成堆叠柱状图?

实现男女新冠感染数据的堆叠柱状图并解决报错

问题说明

现有两个数据框:

  • dbDateSubMSortNacional:存储女性新冠感染数据,含fecha(日期)、total(当日感染数)字段
  • dbDateSubHSortNacional:存储男性新冠感染数据,字段结构与上述一致

已分别绘制单性别柱状图,需合并为堆叠柱状图;尝试他人方案时出现报错:Error in cbind(total.2022 - 1 - 10, total.2022 - 1 - 11, total.2022 - : object 'total.2022' not found


报错原因分析

提供的错误代码存在两处致命问题:

  1. 错误将日期格式(如2022-01-10)拆解为变量名+减法运算(total.2022-01-10被解析为total.2022减去1再减去10),但不存在名为total.2022的对象
  2. 数据结构逻辑混乱,未正确关联性别与感染数的对应关系

正确实现步骤(基于基础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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:50:41