如何在Plotly R中组合饼图与柱状图并实现1行3列排版?
代码修改方案
原代码核心问题说明
- 网格列数配置错误:需求为1行3列布局,但原代码
grid参数仅设置了2列,无法容纳第三张柱状图 - 全局坐标轴配置错误:全局关闭了x、y轴的刻度显示,会导致第三列柱状图无法正常展示年月分类、数值坐标轴
- 子图坐标轴未绑定:多网格布局下第三列的柱状图未指定对应坐标轴ID,会和全局轴冲突
- 冗余配置:同一个
layout内重复定义了showlegend参数 - 配色未统一:没有显式绑定标签和颜色的映射关系,无法保证饼图、柱状图同标签配色一致
修改后可运行代码
# 第一步:先生成统一配色映射,保证所有图表同标签配色一致 # 提取两个数据框共有的Instr唯一值 instr_unique <- unique(c(ov_backet_instr$Instr, ov_pivot_instr$Instr)) # 生成自定义配色,可根据需求调整调色板函数,这里用RColorBrewer的Paired调色板举例 library(RColorBrewer) color_map <- setNames(brewer.pal(length(instr_unique), "Paired"), instr_unique) plot_ly(legendgroup = ~Instr, colors = color_map) %>% # 第一个饼图:按Volume统计 add_pie( data = ov_backet_instr, labels = ~Instr, values = ~Volume, domain = list(row = 0, column = 0), hole = 0.6, textinfo = 'label+value+percent', textposition = 'outside' ) %>% # 第二个饼图:按Number统计 add_pie( data = ov_backet_instr, labels = ~Instr, values = ~Number, domain = list(row = 0, column = 1), hole = 0.6, textinfo = 'label+value+percent', textposition = 'outside', showlegend = FALSE # 避免饼图重复生成图例 ) %>% # 第三个柱状图:按年月分组统计 add_bars( data = ov_pivot_instr, x=~Year_month, y=~Number, name = ~Instr, text = ~Number, domain = list(row = 0, column = 2), xaxis = "x3", # 绑定第三列的x坐标轴 yaxis = "y3", # 绑定第三列的y坐标轴 showlegend = FALSE # 避免柱状图重复生成图例 ) %>% layout( title = "Channels", showlegend = TRUE, grid = list(rows = 1, columns = 3), # 修改为3列 # 前两列饼图的坐标轴隐藏 xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE), yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE), xaxis2 = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE), yaxis2 = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE), # 第三列柱状图的坐标轴正常显示,可根据需求调整样式 xaxis3 = list(showgrid = FALSE, zeroline = FALSE, title = "年月"), yaxis3 = list(showgrid = TRUE, zeroline = FALSE, title = "数量") )
关键修改说明
- 提前生成了和
Instr唯一值绑定的配色映射,保证所有子图同标签的配色完全一致 - 网格参数修改为
columns=3适配1行3列的布局需求 - 为第三列柱状图单独绑定了
x3、y3坐标轴,仅隐藏前两列饼图的坐标轴,不影响柱状图的坐标轴显示 - 仅保留第一个饼图的图例生成,避免同一个标签重复出现在图例中,同时保留
legendgroup配置,点击图例可同步控制所有子图同标签系列的显示/隐藏
内容的提问来源于stack exchange,提问作者Davit
相关产品推荐
相关产品推荐

