首页 > 解决方案 > 为什么 Seaborn 会在我的数据中创建一个额外的类别?

问题描述

我正在尝试在 Python 3.6.5 下使用Seaborn 0.9.0 绘制一些简单的数据。数据只是彼此分类不同的两个点。分类本身就是1or 2。但是,当我使用 Seaborn 绘制它时,图例显示了三种类型012.

import numpy
import seaborn
import pandas
from matplotlib import pyplot

X = numpy.array([
    [-1, -1, 1],
    [1, 1, 2]
])

data = pandas.DataFrame(X, columns=('x','y','type'))

seaborn.scatterplot(data=data, x='x', y='y', hue='type')

pyplot.show()

结果图显示:

类型为 0、1 和 2 的散点图

我也尝试过不使用 Pandas 的方法,只使用 eg x=X[:,0], y=X[:,1], hue=X[:,2],但结果是一样的。

Seaborn 文档对这个hue论点这么说:

可以是分类的或数字的,尽管在后一种情况下颜色映射的行为会有所不同。

但他们没有澄清“分类”是什么意思,或者行为是什么,或者它有什么不同。我还阅读了分类数据绘图教程,但没有找到答案。

'1'在数据中使用和之类的字符串'2'只会导致错误:

AttributeError: 'str' object has no attribute 'view'

0为什么在图例中有一个额外的“类型” ?而且,对于以后,我怎样才能拥有更有意义的类别标签?


再阅读分类数据绘图教程,我发现了这一点:

如果您的数据具有 pandas Categorical 数据类型,则可以在此处设置类别的默认顺序。如果传递给分类轴的变量看起来是数字的,则级别将被排序。但数据仍被视为分类数据并绘制在分类轴上的序数位置(特别是在 0、1、...),即使使用数字标记它们:

这部分解释了这里发生的事情(不是为什么有一个额外的0类别),但即使使用 Pandas 分类类型也无济于事。添加

data['type'] = data['type'].astype('category')

...将此数据转换为分类类型,但 Seaborn 仍然给出错误:

TypeError: data type not understood

标签: pythonpandasseaborn

解决方案


您确实在这里遇到了“数字”颜色映射,这意味着 seaborn 将尝试使用有意义的(对自身而言)数据子集数量来从中创建图例。这将至少是 3 种不同的颜色。

2当用大的东西替换数组中的数字时,这可能会变得更加明显,例如900

在此处输入图像描述

这里的解决方案确实是激活“分类”映射。的legend参数scatterplot可以取三个值

legend: “brief”, “full”, or False, optional
如何绘制图例。如果“简短”,数字色调和大小变量将用均匀间隔值的样本表示。如果“已满”,则每个组都将在图例中获得一个条目。如果为 False,则不添加图例数据并且不绘制图例。

所以有点不直观(至少在这种情况下)你可以设置

legend="full"

为色调列中的每个唯一值获取一个图例条目(因此比使用“简要”少一个)。

seaborn.scatterplot(data=data, x='x', y='y', hue='type', legend="full")

在此处输入图像描述

请注意,使用字符串作为类别起作用,但这些字符串不能转换为数字。

import numpy
import seaborn
import pandas
from matplotlib import pyplot

X = numpy.array([
    [-1, -1, "A"],
    [ 1,  1, "B"]])

data = pandas.DataFrame(X, columns=('x','y','type'))

seaborn.scatterplot(data=data, x='x', y='y', hue='type', legend="brief")

pyplot.show()

在此处输入图像描述


推荐阅读