Plotly: как указать цвета для группы с помощью go.Bar?

Как использовать plotly.graph_objs для построения данных pandas аналогично plotly.express - в частности, для раскрашивания различных типов данных?

Функциональность plotly express для группировки типов данных на основе значения в столбце pandas действительно полезна. К сожалению, я не могу использовать экспресс в своей системе (так как мне нужно отправить объект графика в orca)

Я могу получить ту же функциональность, специально сопоставив Type с цветами (full_plot в приведенном ниже примере), однако у меня есть типы A-Z, есть ли лучший способ сопоставить каждый возможный Type в фрейме данных с цветом?

import pandas as pd
import plotly.express as px
import plotly.graph_objs as go

d = {'Scenario': [1, 2, 3, 1, 2,3],
     'Type': ["A", "A", "A", "B", "B", "B"],
     'VAL_1': [100, 200, 300, 400 , 500, 600],
     'VAL_2': [1000, 2000, 3000, 4000, 5000, 6000]}
df = pd.DataFrame(data=d)


def quick_plot(df):

    fig = px.bar(df, y='VAL_1',  x='Scenario',  color="Type", barmode='group')
    fig['layout'].update(title = "PX Plot",
                     width = 600, height = 400,
                     xaxis = dict(showgrid=False))
    fig.show()


def full_plot(df):

    colors = {'A': 'blue',
          'B': 'red'}
    s0=df.query('Type=="A"')
    s1=df.query('Type=="B"')

    fig = go.Figure()
    fig.add_trace(go.Bar(
        name='A',
         y=s0['VAL_1'],x=s0['Scenario'], marker={'color': colors['A']}))
    fig.add_trace(go.Bar(
        name='B',
         y=s1['VAL_1'],x=s1['Scenario'], marker={'color': colors['B']}))

    fig['layout'].update(title = "Full Plot",
                     width = 600, height = 400)

    fig.update_layout(barmode='group')
    fig.show()

quick_plot(df)
full_plot(df)

person ceharep    schedule 12.05.2020    source источник


Ответы (1)


Вы можете просто использовать такой словарь:

colors = {'A':'steelblue',
          'B':'firebrick'}

Единственная проблема заключается в том, чтобы сгруппировать фрейм данных для каждого уникального типа и добавить новую трассировку для каждого типа с помощью цикла for. Приведенный ниже фрагмент кода позаботится об этом для создания этого графика:

введите описание изображения здесь

# imports
import pandas as pd
import plotly.express as px
import plotly.graph_objs as go

# data
d = {'Scenario': [1, 2, 3, 1, 2,3],
     'Type': ["A", "A", "A", "B", "B", "B"],
     'VAL_1': [100, 200, 300, 400 , 500, 600],
     'VAL_2': [1000, 2000, 3000, 4000, 5000, 6000]}
df = pd.DataFrame(data=d)

# assign colors to type using a dictionary
colors = {'A':'steelblue',
          'B':'firebrick'}

# plotly figure
fig=go.Figure()
for t in df['Type'].unique():
    dfp = df[df['Type']==t]
    fig.add_traces(go.Bar(x=dfp['Scenario'], y = dfp['VAL_1'], name=t,
                         marker_color=colors[t]))

fig.show()
person vestland    schedule 12.05.2020