为什么Seaborn在我的数据中创建一个额外的类别?

时间:2018-10-19 01:38:03

标签: python pandas seaborn

我试图在Python 3.6.5下使用Seaborn 0.9.0绘制一些简单数据。数据只是彼此不同的分类的两个点。分类本身就是12。但是,当我用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()

结果图显示:

Scatterplot with types 0, 1 and 2

我也尝试过在不使用Pandas的情况下,仅使用x=X[:,0], y=X[:,1], hue=X[:,2],但是结果是相同的。

Seaborn的文档中关于hue的说法是这样的:

  

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

但是他们没有阐明“分类”的含义,行为是什么,或行为如何不同。我也读过categorical data plotting tutorial,但没有找到答案。

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

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

为什么图例中还有0的额外“类型”?而且,稍后,我如何拥有更有意义的类别标签?


再读categorical data plotting tutorial时,我发现:

  

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

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

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

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

TypeError: data type not understood

1 个答案:

答案 0 :(得分:3)

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

当用较大的数字(例如,)替换数组中的数字2时,这一点可能会变得更加明显。 900

enter image description here

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

  

legend:“简要”,“完整”或False,可选
  如何绘制图例。如果为“简短”,则数字色相和大小变量将以均匀间隔的值的样本表示。如果“满”,每个组将在图例中获得一个条目。如果为False,则不会添加图例数据,也不会绘制图例。

这样(至少在这种情况下),您可以设置

legend="full"

在hue列中获得每个唯一值的图例条目(因此比使用“ brief”少一个)。

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

enter image description here

请注意,可以将字符串用作类别 ,但是这些字符串不能转换为数字。

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()

enter image description here