如何在缺少值的matplotlib中使用分类配色方案?

问题描述 投票:0回答:1

[我想在python中创建一个散点图,并用分类变量着色,该分类变量处理并绘制分类颜色变量的缺失值。

以虹膜数据集为例

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

Seaborn可以按颜色绘制:

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

还有一点工作,matplotlib可以(取自this answer

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]))
matplotlib plot seaborn
1个回答
0
投票

我还没有找到seaborn的解决方案,但是您可以调整lambda函数以在matplotlib中工作。如果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: colours[x] if x in colours.keys() else 'grey')

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

我相信问题是np.nan与字典键不匹配(即使您尝试也是如此)。此解决方案附带一个警告,如果您的颜色词典缺少您的任何类别,它将被绘制为NA颜色。

© www.soinside.com 2019 - 2024. All rights reserved.