Сохранять исходный порядок полос в Plotly Python при передаче цвета

Использование Plotly для гистограммы сохраняет порядок набора данных, если не используется color:

import pandas as pd
import plotly.express as px

df = pd.DataFrame({'val': [1, 2, 3],
                   'type': ['b', 'a', 'b']},
                  index=['obs1', 'obs2', 'obs3'])
px.bar(df, 'val')

введите здесь описание изображения Но color меняет порядок данных:

px.bar(df, 'val', color='type')

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

Как я могу сохранить исходный порядок при использовании color arg?

Это похоже на Как мне сохранить желаемый порядок в линейчатой ​​диаграмме R Plotly с переменной цвета, но я использую Python, а не R.


person Max Ghenis    schedule 23.11.2020    source источник


Ответы (2)


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

import pandas as pd
import plotly.express as px

df = pd.DataFrame({'val': [1, 2, 3],
                   'type': ['b', 'a', 'b']},
                  index=['obs1', 'obs2', 'obs3'])
fig = px.bar(df, 'val', color='type', category_orders={'index': df.index[::-1]})
fig.show()

Вывод

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

Из документации:

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

Посмотрев на code кажется, что color используется как атрибут группировки, поэтому, вероятно, происходит переупорядочение.

person Dani Mesejo    schedule 23.11.2020

Я действительно не знаю, зачем это делать в plotly express, но вы можете использовать обходной путь, используя массив для изменения порядка yaxis fig.update_layout( yaxis={'categoryorder':'array', 'categoryarray':df.index}):

import pandas as pd
import plotly.express as px

df = pd.DataFrame({'val': [1, 2, 3],
                   'type': ['b', 'a', 'b']},
                  index=['obs1', 'obs2', 'obs3'])
fig=px.bar(df, x='val',y=df.index, orientation='h')


fig=px.bar(df, x='val',y=df.index, color='type', orientation='h')
fig.update_layout( yaxis={'categoryorder':'array', 'categoryarray':df.index})

результат:

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

person Renaud    schedule 23.11.2020