Plotly:如何通过 variable/labels 在 plotly.graph_objects 中定义颜色(饼图和条形图)

Plotly: How to define colors by variable/labels in plotly.graph_objects (Pie & Bar)

我是 plotly 的新手,下面有两个不同的图 (go.Pie & go.Bar),我想为每种类型 (a: g) 标签分配一种颜色,如下所示color_discrete_map。如何将它们包含在 go.pie 和 go.bar 的代码中?谢谢

数据框:

    color_discrete_map = {'a':'rgb(42,9,4)', 
                              'b':'rgb(111,203,209)',
                              'c':'rgb(55,165,172),',
                              'd':'rgb(29,127,136)',
                              'e':'rgb(2,84,92)',
                              'f':'rgb(4,37,42)'}
    
    unit_mix_pie.add_trace(go.Pie(labels=df.index, values=df['type']), row=1, col=1)


unit_mix_bar.add_trace(go.Bar(x=df.index, y=round(df['type'],0), marker=dict(
        color=px.colors.qualitative.Pastel2, color_discrete_map=color_discrete_map,
        line=dict(color='#000000', width=2)
    )), row=1, col=1)

我对 unit_mix_pieunit_mix_bar 是只有一行和一列的子图这一点感到有点困惑 - 你可以将这些对象中的每一个定义为 plotly graph_object 或情节表达的数字。

如果您使用 plotly express 定义 unit_mix_pie,您可以直接将您的 color_discrete_map 作为参数传递:

import pandas as pd
import plotly.express as px

df = pd.DataFrame(data={'type':list('abcdefg'), 'no':[50,100,200,300,400,500,600]})

## added another color for the type 'g'
color_discrete_map = {'a':'rgb(42,9,4)', 
                          'b':'rgb(111,203,209)',
                          'c':'rgb(55,165,172)',
                          'd':'rgb(29,127,136)',
                          'e':'rgb(2,84,92)',
                          'f':'rgb(4,37,42)',
                          'g':'purple'}

unit_mix_pie = px.pie(df, values='no', names='type', color='type', color_discrete_map=color_discrete_map)
unit_mix_pie.show()

然后您可以将 unit_mix_bar 定义为 plotly graph_object 以单独使用轨迹添加条形图,将它们的类型映射到它们的颜色(我借用 ):

import plotly.graph_objects as go

## add the bars one at a time
unit_mix_bar=go.Figure()
for t in df['type'].unique():
    dfp = df[df['type']==t]
    unit_mix_bar.add_traces(go.Bar(x=dfp['no'], y = dfp['type'], name=t,
                         marker_color=color_discrete_map[t]))
unit_mix_bar.show()