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

在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
)

关键改进点

  1. 数据结构修正:用矩阵形式传入barplot,保证每个「城市-树种」组的两个系列柱子成对显示;
  2. 两级X轴自定义:通过tapply计算每组标签的中心位置,分别添加城市(一级)和树种(二级)标签,层级清晰;
  3. 细节优化:关闭默认X轴、调整标签位置/角度、添加网格线,还原Excel图表的视觉风格。

内容的提问来源于stack exchange,提问作者Maggie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:16:10