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

如何用R Plotly简洁实现带颜色与图案编码的堆叠柱状图?

简洁实现堆叠柱状图的方法

你的问题在于直接调用plot_ly()时,color = data.df$age_compartment会将相同age_compartment的组合并为单个trace,无法生成对应age_compartment_subject的8个堆叠层。可以通过拆分数据框并批量添加trace的方式简化代码,避免重复编写add_trace。

方法1:使用purrr::map批量添加trace

加载必要的包后,拆分数据并循环添加每个分组对应的trace:

library(plotly)
library(dplyr)
library(purrr)

# 按age_compartment_subject拆分数据
data_split <- split(data.df, data.df$age_compartment_subject)

# 初始化plotly对象
p <- plot_ly(type = "bar")

# 循环添加每个trace
p <- map_dfr(data_split, function(df) {
  add_trace(p,
            x = df$cluster,
            y = df$y.val,
            name = unique(df$age_compartment_subject),
            marker = list(
              color = unique(df$color),
              pattern = list(shape = unique(df$shape))
            ))
})

# 设置布局
p <- layout(p, yaxis = list(title = "%"), barmode = "stack")

p

方法2:使用基础for循环添加

如果不习惯purrr,也可以用基础循环实现:

library(plotly)
library(dplyr)

# 拆分数据
data_split <- split(data.df, data.df$age_compartment_subject)

# 初始化绘图对象
p <- plot_ly(type = "bar")

# 循环添加trace
for (df in data_split) {
  p <- add_trace(p,
                 x = df$cluster,
                 y = df$y.val,
                 name = unique(df$age_compartment_subject),
                 marker = list(
                   color = unique(df$color),
                   pattern = list(shape = unique(df$shape))
                 ))
}

# 设置布局
p <- layout(p, yaxis = list(title = "%"), barmode = "stack")

p

原代码失效原因

原代码中color = data.df$age_compartment会让plotly自动将相同颜色组的行合并为一个trace,导致每个柱子的堆叠层数变成age_compartment的4个水平,而非你需要的8个age_compartment_subject水平。通过拆分数据并逐个添加trace,能确保每个age_compartment_subject都成为独立的堆叠层,同时保留对应的颜色和图案设置。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 01:15:07