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
相关产品推荐
相关产品推荐

