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

Plotly go.Pie子图修改调色板时如何保持图例一致性?

解决Plotly子图饼图自定义调色板时类别颜色不匹配问题

当用Plotly制作包含两个饼图的子图时,使用默认调色板能自动让相同类别的颜色一致,但自定义调色板后,若两个DataFrame的类别顺序不同,会出现类别颜色错位、图例不统一的问题,且不想通过排序DataFrame解决。

测试数据:

import pandas as pd
import plotly.subplots as sp
import plotly.graph_objects as go

yearly = pd.DataFrame(data={'index': ['A', 'B','C','D'], 'count': [3000, 2000,1000,50]})
monthly = pd.DataFrame(data={'index': ['B', 'A','C','D'], 'count': [250, 200,80,10]})

常见错误代码(导致颜色错位)

直接用update_traces设置自定义调色板,会因DF顺序不同导致颜色错位:

# 自定义调色板
custom_colors = ["#FF5733", "#33FF57", "#3357FF", "#FF33A6"]

fig = sp.make_subplots(rows=1, cols=2, specs=[[{"type": "pie"}, {"type": "pie"}]])
fig.add_trace(go.Pie(labels=yearly['index'], values=yearly['count'], name='年度'), row=1, col=1)
fig.add_trace(go.Pie(labels=monthly['index'], values=monthly['count'], name='月度'), row=1, col=2)

# 错误的自定义颜色设置
fig.update_traces(marker=dict(colors=custom_colors))
fig.show()

此时年度饼图A对应#FF5733,月度饼图B对应#FF5733,颜色完全错位。

优雅解决方案:类别-颜色映射字典

核心思路是给每个类别绑定固定颜色,不管DF中类别顺序如何,颜色始终对应正确。同时统一图例,只保留一个图例入口。

完整代码:

import pandas as pd
import plotly.subplots as sp
import plotly.graph_objects as go

# 测试数据
yearly = pd.DataFrame(data={'index': ['A', 'B','C','D'], 'count': [3000, 2000,1000,50]})
monthly = pd.DataFrame(data={'index': ['B', 'A','C','D'], 'count': [250, 200,80,10]})

# 定义类别-颜色映射字典(关键!)
color_map = {
    'A': "#FF5733",
    'B': "#33FF57",
    'C': "#3357FF",
    'D': "#FF33A6"
}

# 创建子图
fig = sp.make_subplots(rows=1, cols=2, specs=[[{"type": "pie"}, {"type": "pie"}]])

# 添加年度饼图:根据类别从映射字典取颜色,显示图例
fig.add_trace(go.Pie(
    labels=yearly['index'],
    values=yearly['count'],
    name='年度',
    marker=dict(colors=[color_map[label] for label in yearly['index']]),
    showlegend=True  # 只让第一个饼图显示图例
), row=1, col=1)

# 添加月度饼图:同样从映射字典取颜色,隐藏图例
fig.add_trace(go.Pie(
    labels=monthly['index'],
    values=monthly['count'],
    name='月度',
    marker=dict(colors=[color_map[label] for label in monthly['index']]),
    showlegend=False  # 隐藏第二个饼图的图例
), row=1, col=2)

# 调整布局
fig.update_layout(title_text="年度/月度数据对比", title_x=0.5)
fig.show()

方案优势

  1. 无需修改DataFrame的类别顺序,完全保留原始数据结构
  2. 每个类别绑定固定颜色,无论在哪个饼图中,相同类别颜色绝对一致
  3. 统一图例,避免重复图例干扰视觉

内容的提问来源于stack exchange,提问作者MarieL-A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:10:47