Plotly- Express: Как исправить цветовое сопоставление при настройке цвета по имени столбца - PullRequest
1 голос
/ 13 января 2020

Я использую plotly express для точечного графика. Цвет маркеров определяется переменной моего фрейма данных, как в примере ниже.

import pandas as pd
import numpy as np
import plotly.express as px

df = px.data.iris()

fig = px.scatter(df[df.species.isin(['virginica', 'setosa'])], x="sepal_width", y="sepal_length", color="species")
fig.show()

enter image description here

Когда я добавляю еще один экземпляр эта переменная, цветовая карта меняется (сначала «virginica», красный, затем зеленый).

fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species",size='petal_length', hover_data=['petal_width'])
fig.show()

enter image description here

Как сохранить отображение цветов при добавлении переменных?

Ответы [ 2 ]

1 голос
/ 14 января 2020

Я нашел решение. Функция px.scatter имеет аргумент color_discrete_map, который именно то, что мне нужно. color_discrete_map использует словарь, где ключами являются значения вида, а значения - цвета, присвоенные виду.

import plotly.express as px    

df = px.data.iris()
color_discrete_map = {'virginica': 'rgb(255,0,0)', 'setosa': 'rgb(0,255,0)', 'versicolor': 'rgb(0,0,255)'}
fig = px.scatter(df[df.species.isin(['virginica', 'setosa'])], x="sepal_width", y="sepal_length", color="species", color_discrete_map=color_discrete_map)
fig.show()

enter image description here

fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species", color_discrete_map=color_discrete_map)
fig.show()

enter image description here

1 голос
/ 13 января 2020

Источник задания:

px.Scatter() назначит цвет переменной в том порядке, в каком они появляются в вашем кадре данных. Здесь вы используете два разных источника df и df[df.species.isin(['virginica', 'setosa', 'versicolor'])] (назовем последний df2). Запуск df2['species'].unique() даст вам:

array(['setosa', 'virginica'], dtype=object)

А запуск df['species'] даст вам:

array(['setosa', 'versicolor', 'virginica'], dtype=object)

Видите, что versicolor появляется в середине? Вот почему red больше не присваивается 'virginica', а вместо 'versicolor'.

Предлагаемое решение:

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

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

Использование полного кода и переключение между строками в # data subsets даст вам три следующих графика:

Участок 1: order=['virginica']

enter image description here

Участок 2: ['virginica', 'setosa']

enter image description here

Участок 3: order=['virginica', 'setosa', 'versicolor']

enter image description here

Полный код:

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

# data
df = px.data.iris()

# function to subset and order a pandas
# dataframe fo a long format
def order_df(df_input, order_by, order):
    df_output=pd.DataFrame()
    for var in order:    
        df_append=df_input[df_input[order_by]==var].copy()
        df_output = pd.concat([df_output, df_append])
    return(df_output)

# data subsets
df_express = order_df(df_input = df, order_by='species', order=['virginica'])
df_express = order_df(df_input = df, order_by='species', order=['virginica', 'setosa'])
df_express = order_df(df_input = df, order_by='species', order=['virginica', 'setosa', 'versicolor'])

# plotly
fig = px.scatter(df_express, x="sepal_width", y="sepal_length", color="species")
fig.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...