Источник задания:
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']
Участок 2: ['virginica', 'setosa']
Участок 3: order=['virginica', 'setosa', 'versicolor']
Полный код:
# 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()