如何用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
相关产品推荐
相关产品推荐

