Как использовать категориальную цветовую схему в matplotlib с пропущенными значениями? - PullRequest
0 голосов
/ 29 мая 2020

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

Используя набор данных радужной оболочки в качестве примера

import seaborn as sns
iris = sns.load_dataset('iris')

Сиборн может рисовать по цвету:

sns.lmplot('sepal_length', 'sepal_width', hue='species', data=iris, fit_reg=False)

Немного поработав, то может и matplotlib (взято из этого ответа )

colours = {'setosa':'skyblue', 'versicolor':'orangered', 'virginica':'forestgreen'}
plt.scatter(iris.sepal_length, iris.sepal_width, c=iris.species.apply(lambda x:colours[x]))

Но ни то, ни другое не будет на графике отсутствуют цвета. Если мы установим переменную разновидностей (которую мы используем для раскрашивания графика) равной np.nan для одного вида, морские корни не будут отображать эти точки, и matplotlib ничего не построит.

iris.species[iris.species == 'setosa'] = np.nan

sns.lmplot('sepal_length', 'sepal_width', hue='species', data=iris, fit_reg=False)
iris.plot('sepal_length', 'sepal_width', kind="scatter", c=iris.species.apply(lambda x:colours[x]))

1 Ответ

0 голосов
/ 29 мая 2020

Я не нашел решения с seaborn, но вы можете настроить лямбда-функцию, чтобы она работала в matplotlib. Если species находится в вашем цветовом словаре, он ищет цвет там, но если species равен нулю, он возвращает новый цвет.

import seaborn as sns
iris = sns.load_dataset('iris')

#colour dictionary
colours = {'setosa':'skyblue', 'versicolor':'orangered', 'virginica':'forestgreen'}

col_convert = np.vectorize(lambda x: 'grey' if pd.isnull(x) else colours[x])

plt.scatter(iris.sepal_length, iris.sepal_width, c=col_convert(iris.species))
...