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()
方案优势
- 无需修改DataFrame的类别顺序,完全保留原始数据结构
- 每个类别绑定固定颜色,无论在哪个饼图中,相同类别颜色绝对一致
- 统一图例,避免重复图例干扰视觉
内容的提问来源于stack exchange,提问作者MarieL-A
相关产品推荐
相关产品推荐

