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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:48:19