如何在plot3D的3D直方图中按组配色并添加图例
自定义3D直方图解决方案(基于plot3D包)
以下是实现需求的完整代码和步骤说明:
1. 加载包与数据
首先确保安装并加载plot3D包,导入VADeaths数据集:
# 首次使用需安装包 # install.packages("plot3D") library(plot3D) data(VADeaths)
2. 定义分组与颜色映射
将原始年龄组合并为3个类别,并为每个类别分配指定颜色:
# 原始年龄组到合并类别的映射 age_groups <- c( "50-54" = "五十多岁", "55-59" = "五十多岁", "60-64" = "六十多岁", "65-69" = "六十多岁", "70-74" = "70+" ) # 各合并类别的颜色配置 group_colors <- c( "五十多岁" = "#0072B2", # 蓝色 "六十多岁" = "#F0E442", # 黄色 "70+" = "#FFFFFF" # 白色 ) # 生成每个原始年龄组对应的颜色向量 x_colors <- group_colors[age_groups[rownames(VADeaths)]]
3. 绘制3D直方图
使用hist3D绘制图形,通过col参数传入分组颜色:
hist3D( x = 1:5, y = 1:4, z = VADeaths, bty = "g", phi = 20, theta = -60, xlab = "", ylab = "", zlab = "", main = "VADeaths 年龄组死亡分布", col = x_colors, border = "black", shade = 0.8, ticktype = "detailed", space = 0.15, d = 2, cex.axis = 1e-9 )
4. 添加轴标签
调整x轴标签为合并后的类别,y轴保留原有标签:
# 添加合并后的年龄组标签(对应分组位置居中) text3D( x = c(1.5, 3.5, 5), y = rep(0.5, 3), z = rep(3, 3), labels = names(group_colors), add = TRUE, adj = 0, cex = 1.2 ) # 添加性别与城乡标签 text3D( x = rep(1, 4), y = 1:4, z = rep(0, 4), labels = colnames(VADeaths), add = TRUE, adj = 1, cex = 1.2 )
5. 添加右侧图例
用基础绘图的legend函数在图右侧添加颜色说明:
legend( x = "topright", inset = c(-0.2, 0), legend = names(group_colors), fill = unname(group_colors), border = "black", bty = "n", # 隐藏图例边框 cex = 1.1 )
关键说明
- 颜色映射:通过向量匹配,让每个原始年龄组的柱子自动对应到合并类别的颜色
- 标签位置:将合并组标签放在对应原始组的中间位置,更直观展示分组逻辑
- 图例调整:利用
inset参数将图例偏移到图右侧,避免遮挡主体图形
内容的提问来源于stack exchange,提问作者Chris T.
相关产品推荐
相关产品推荐

