【问题标题】:How to use categorical colour scheme in matplotlib with missing values?如何在 matplotlib 中使用缺失值的分类配色方案?
【发布时间】:2020-09-16 21:42:02
【问题描述】:

我想在 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 一个物种,seaborn 不会绘制这些点,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】:

    我还没有找到使用 seaborn 的解决方案,但您可以调整 lambda 函数以在 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))
    

    【讨论】:

    • 是的,np.nan == np.nan 在 Python 中的计算结果为 False。我认为您需要在实际数据集上执行 fillna("missing") 或类似操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    相关资源
    最近更新 更多