基于Plotly实现双侧可堆叠分组柱状图的技术问询
解决方案:实现带Yes/No左右分组的堆叠柱状图
要实现每个类别左右两侧分别展示Yes/No对应的堆叠模型柱状图,且两侧数值独立,你需要重构数据结构并调整Plotly的offsetgroup和base参数,具体实现如下:
修改后的完整代码
from plotly import graph_objects as go # 重构数据,分离Yes/No两侧的各模型数值 data = { "labels": ["feature", "question", "bug", "documentation", "maintenance"], # Yes侧各模型数据 "yes_original": [15, 23, 32, 10, 23], "yes_model_1": [4, 8, 18, 6, 0], "yes_model_2": [11, 18, 18, 0, 20], # No侧各模型数据(可与Yes侧完全独立) "no_original": [5, 12, 20, 8, 15], "no_model_1": [2, 5, 10, 3, 0], "no_model_2": [3, 7, 10, 0, 12] } fig = go.Figure() # 添加Yes侧的堆叠柱状图(左侧分组) fig.add_trace(go.Bar( name="Original (Yes)", x=data["labels"], y=data["yes_original"], offsetgroup=0, # 标记为左侧分组 marker_color="#1f77b4" )) fig.add_trace(go.Bar( name="Model 1 (Yes)", x=data["labels"], y=data["yes_model_1"], offsetgroup=0, base=data["yes_original"], # 堆叠在Original之上 marker_color="#ff7f0e" )) fig.add_trace(go.Bar( name="Model 2 (Yes)", x=data["labels"], y=data["yes_model_2"], offsetgroup=0, base=[o + m1 for o, m1 in zip(data["yes_original"], data["yes_model_1"])], # 堆叠在Original+Model1之和上 marker_color="#2ca02c" )) # 添加No侧的堆叠柱状图(右侧分组) fig.add_trace(go.Bar( name="Original (No)", x=data["labels"], y=data["no_original"], offsetgroup=1, # 标记为右侧分组 marker_color="#1f77b4", opacity=0.7 # 用透明度区分同模型的Yes/No侧 )) fig.add_trace(go.Bar( name="Model 1 (No)", x=data["labels"], y=data["no_model_1"], offsetgroup=1, base=data["no_original"], marker_color="#ff7f0e", opacity=0.7 )) fig.add_trace(go.Bar( name="Model 2 (No)", x=data["labels"], y=data["no_model_2"], offsetgroup=1, base=[o + m1 for o, m1 in zip(data["no_original"], data["no_model_1"])], marker_color="#2ca02c", opacity=0.7 )) # 布局优化 fig.update_layout( title="Issue Types - Yes/No Split with Model Stacking", yaxis_title="Number of Issues", xaxis_title="Issue Category", barmode="stack", # 启用堆叠模式 legend_title="Model & Yes/No", margin=dict(l=40, r=40, t=40, b=40) ) fig.show()
关键实现细节
- 数据结构重构:新增
yes_和no_前缀的字段,分别存储两侧的模型数值,确保Yes/No侧的数值完全独立 - 分组控制:通过
offsetgroup参数(0对应左侧Yes组,1对应右侧No组),让每个类别标签下生成两组独立的堆叠柱 - 堆叠逻辑:
base参数指定当前柱子的起始高度,Yes/No侧分别计算前序堆叠模型的数值之和,实现独立堆叠 - 视觉区分:同一模型的Yes/No侧使用相同颜色+不同透明度,既保持模型识别性,又能区分Yes/No分组
内容的提问来源于stack exchange,提问作者PracticingPython
相关产品推荐
相关产品推荐

