R语言ggplot2如何绘制立方体效果的3D堆叠柱状图
R实现3D立方体效果堆叠柱状图
R完全可以实现你需要的带立方体3D视觉效果的堆叠柱状图,以下提供两种可直接复用的实现方案,适配你给出的示例数据结构。
前置数据处理
你提供的原始数据结构可用,先提前计算每个堆叠块的上下沿坐标,方便3D块绘制:
library(ggplot2) set.seed(123) specie <- c(rep("sorgho" , 3) , rep("poacee" , 3) , rep("banana" , 3) , rep("triticum" , 3)) condition <- rep(c("normal" , "stress" , "Nitrogen", "T") , 3) value <- abs(rnorm(12, 0 ,15)) data <- data.frame(specie,condition,value) # 计算每个堆叠分段的y轴上下边界 data <- data[order(data$specie, match(data$condition, c("normal", "stress", "Nitrogen", "T"))), ] data$ymin <- ave(data$value, data$specie, FUN = function(x) c(0, cumsum(head(x, -1)))) data$ymax <- ave(data$value, data$specie, FUN = cumsum)
方案1:ggplot2原生绘制等距伪3D立方体柱(自定义程度最高)
这个方案不需要依赖重型3D渲染包,通过给每个堆叠矩形添加受光顶面、阴影侧面模拟立方体效果,和参考图的视觉风格匹配度最高,渲染速度快。
如果运行时提示找不到darken/lighten函数,先执行install.packages("colorspace");library(colorspace)安装加载对应工具包即可。
# 3D透视参数,可根据效果自行调整 offset_x <- 0.08 # 水平方向透视偏移量 offset_y <- 2 # 垂直方向透视偏移量 ggplot() + # 绘制柱体正面 geom_rect(data = data, aes(xmin = as.numeric(factor(specie)) - 0.15, xmax = as.numeric(factor(specie)) + 0.15, ymin = ymin, ymax = ymax, fill = condition), alpha = 0.8) + # 绘制柱体右侧暗面 geom_polygon(data = data, aes(x = c(as.numeric(factor(specie)) + 0.15, as.numeric(factor(specie)) + 0.15 + offset_x, as.numeric(factor(specie)) + 0.15 + offset_x, as.numeric(factor(specie)) + 0.15), y = c(ymin, ymin + offset_y, ymax + offset_y, ymax), group = interaction(specie, condition), fill = after_scale(darken(fill, 0.2))), alpha = 0.8) + # 绘制柱体顶部亮面 geom_polygon(data = data, aes(x = c(as.numeric(factor(specie)) - 0.15, as.numeric(factor(specie)) - 0.15 + offset_x, as.numeric(factor(specie)) + 0.15 + offset_x, as.numeric(factor(specie)) + 0.15), y = c(ymax, ymax + offset_y, ymax + offset_y, ymax), group = interaction(specie, condition), fill = after_scale(lighten(fill, 0.2))), alpha = 0.9) + # 坐标轴与主题配置 scale_x_continuous(breaks = 1:4, labels = levels(factor(data$specie))) + labs(x = "specie", y = "value", fill = "condition") + theme_classic()
可调整的核心参数:
- 透视强度:修改
offset_x、offset_y数值,数值越大立体突出感越强 - 光影对比:修改
darken()、lighten()内的参数,数值越大明暗差越明显 - 柱体宽度:修改
geom_rect中xmin/xmax的差值即可调整柱宽
方案2:rayshader渲染真3D可交互柱形
如果需要可旋转调整视角的真3D效果,可以先绘制基础2D堆叠柱,再用rayshader包直接渲染为3D场景:
# 首次使用先安装包 # install.packages("rayshader") library(rayshader) # 绘制基础2D堆叠柱 p <- ggplot(data, aes(fill=condition, y=value, x=specie)) + geom_bar(position="stack", stat="identity", width = 0.3) + theme_classic() # 渲染3D效果 plot_gg(p, width = 6, height = 4, multicore = TRUE, shadow_intensity = 0.6, offset_edges = TRUE, phi = 35, zoom = 0.7, theta = -30)
调整phi(俯仰角)、theta(水平旋转角)参数可以匹配你需要的透视角度,执行render_snapshot("3d_stack_bar.png")即可导出高清图片。
选型建议:如果需要静态出版级效果、精细调整配色和细节选方案1;如果需要可交互旋转、动态演示效果选方案2。
内容的提问来源于stack exchange,提问作者Rspacer
相关产品推荐
相关产品推荐

