在R中不使用ggplot绘制含两级X轴分类的二维簇状柱形图
用Base R实现带两级X轴的簇状柱形图(无需ggplot)
问题分析
原代码的核心问题是数据分组逻辑错误:直接将E_Plus和iTE拼接成单一向量传入barplot,导致所有EnergyPlus系列的柱子先整体显示,再显示i-Tree Energy系列,完全打乱了「城市-树种」的分组对应关系;同时X轴标签重复、两级分类层级不清晰,和Excel目标图的结构不符。
修正方案(纯Base R实现)
以下代码完全基于R基础包实现,还原Excel中「城市(一级分类)+树种类型(二级分类)」的簇状柱形图结构:
# 原始数据(无需修改) data <- data.frame( City = c("Minneapolis", "Minneapolis", "Minneapolis", "Orlando", "Orlando", "Orlando", "Phoenix", "Phoenix", "Phoenix", "Sacramento", "Sacramento", "Sacramento"), Tree_Type = c("No Tree", "Medium Tree", "Large Tree", "No Tree", "Medium Tree", "Large Tree", "No Tree", "Medium Tree", "Large Tree", "No Tree", "Medium Tree", "Large Tree"), E_Plus = c(158, 133, 123, 879, 863, 827, 2858, 2812, 2779, 421, 363, 351), iTE = c(1354, 1337, 1331, 6057, 6043, 6041, 4356, 4336, 4328, 2125, 2099, 2078) ) # 将数据转换为矩阵:每行对应一个能耗系列,每列对应一个「城市-树种」组合 data_matrix <- rbind(data$E_Plus, data$iTE) # 绘制柱形图,保存柱子的X轴位置,关闭默认X轴 bar_pos <- barplot( height = data_matrix, beside = TRUE, # 簇状显示(每组两个柱子) col = c("red", "blue"), # 对应两个系列的颜色 main = "不同城市与树种类型的能耗对比", ylab = "能耗", ylim = c(0, max(data_matrix) + 500), # 预留顶部空间放数据标签 xaxt = "n" # 不使用默认X轴,后续自定义两级标签 ) # 添加一级X轴:城市标签(每个城市对应3组柱子,取中间位置) city_groups <- rep(unique(data$City), each = 6) # 每个城市对应6个柱子(3组×2个系列) city_center <- tapply(bar_pos, city_groups, mean) text( x = city_center, y = -300, # 调整Y轴位置,避免与二级标签重叠 labels = names(city_center), font = 2, # 加粗显示一级标签 cex = 1 ) # 添加二级X轴:树种类型标签(每组柱子取中间位置) tree_groups <- rep(data$Tree_Type, each = 2) # 每个树种对应2个柱子(两个系列) tree_center <- tapply(bar_pos, tree_groups, mean) text( x = tree_center, y = -150, # 调整Y轴位置 labels = names(tree_center), srt = 45, # 倾斜45度避免重叠 adj = 1, # 右对齐 cex = 0.8 ) # 添加Y轴网格线(模拟Excel图表风格) grid(nx = NA, ny = NULL) # 添加图例 legend( "topright", legend = c("EnergyPlus", "i-Tree Energy"), fill = c("red", "blue"), bty = "n" # 去掉图例边框 ) # 可选:在柱子顶部添加数据标签 text( x = bar_pos, y = data_matrix + 100, # 标签在柱子上方100单位处 labels = data_matrix, cex = 0.7 )
关键改进点
- 数据结构修正:用矩阵形式传入
barplot,保证每个「城市-树种」组的两个系列柱子成对显示; - 两级X轴自定义:通过
tapply计算每组标签的中心位置,分别添加城市(一级)和树种(二级)标签,层级清晰; - 细节优化:关闭默认X轴、调整标签位置/角度、添加网格线,还原Excel图表的视觉风格。
内容的提问来源于stack exchange,提问作者Maggie
相关产品推荐
相关产品推荐

