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

Plotly Python自定义模板堆叠条形图颜色分配异常问题

问题解决:Plotly堆叠条形图颜色分配错误

问题根源

你在模板中设置marker_color=THEME['bar_colors']的逻辑完全反了:这个设置是告诉Plotly单个Bar trace的每个数据点(即每个幕)依次使用颜色数组中的颜色,而你需要的是每个玩家对应的整个Bar trace使用数组中的一个固定颜色。这就导致了每个幕的所有玩家条形被分配同一种颜色,和预期不符。

解决方案

有两种简洁的修正方式,选其一即可:

方式1:在模板中设置全局颜色序列(推荐)

直接在模板的layout中添加colorway属性,指定每个trace的颜色顺序,Plotly会自动给每个玩家的trace依次分配颜色:

修改后的模板代码:

THEME = {
    'bar_colors': [
        '#861388',
        '#d4a0a7',
        '#dbd053',
        '#1b998b',
        '#A0CED9',
        '#3e6680'
    ],
    'background_color': '#ebf2fa',
    'font_family': 'Montserrat',
    'font_color': '#898989',
    'label_font_size': 16,
    'label_background_color': '#ffffff'
}

pio.templates['mytemplate'] = go.layout.Template(
        data=dict(
            bar=[go.Bar()]  # 移除原有的marker_color设置
        ),
        layout=go.Layout(
            font=dict(
                family=THEME['font_family'],
                color=THEME['font_color']
            ),
            paper_bgcolor=THEME['background_color'],
            plot_bgcolor=THEME['background_color'],
            hoverlabel=dict(
                bgcolor=THEME['label_background_color'],
                font_size=THEME['label_font_size']
            ),
            colorway=THEME['bar_colors']  # 全局trace颜色序列
        )
    )

循环添加trace的代码无需修改,Plotly会自动按顺序分配颜色:

playerList = data.Player.unique()
for player in playerList:
    fig.add_trace(go.Bar(
        name=player,
        x=data.loc[data.Player==player].Act,
        y=data.loc[data.Player==player][f'{lineMode}'],
        hovertemplate=get_hover_template(player, lineMode)
))

方式2:循环时手动指定每个玩家的颜色

如果不想修改模板,也可以在循环添加trace时,按玩家索引从颜色数组中取对应颜色:

修改后的循环代码:

playerList = data.Player.unique()
for idx, player in enumerate(playerList):
    # 取对应颜色,超出数组长度时循环取(避免索引越界)
    color = THEME['bar_colors'][idx % len(THEME['bar_colors'])]
    fig.add_trace(go.Bar(
        name=player,
        x=data.loc[data.Player==player].Act,
        y=data.loc[data.Player==player][f'{lineMode}'],
        hovertemplate=get_hover_template(player, lineMode),
        marker_color=color  # 给每个玩家trace指定固定颜色
))

同时需要移除模板中data.bar里的marker_color设置,避免冲突。

验证效果

修改后,每个玩家的所有幕的条形会统一使用颜色数组中的对应颜色,而不是每个幕的所有玩家条形用同一种颜色,符合你的需求。

内容的提问来源于stack exchange,提问作者elnukakujo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 16:08:20