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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 07:07:02