我试图在Python 3.6.5下使用Seaborn 0.9.0绘制一些简单数据。数据只是彼此不同的分类的两个点。分类本身就是1
或2
。但是,当我用Seaborn对其进行绘制时,图例显示了三种类型:0
,1
和2
。
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()
结果图显示:
我也尝试过在不使用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
答案 0 :(得分:3)
您在这里确实遇到了“数字”颜色映射,这意味着seaborn将尝试使用有意义的(本身)数量的数据子集来从中创建图例。这将至少是3种不同的颜色。
当用较大的数字(例如,)替换数组中的数字2
时,这一点可能会变得更加明显。 900
这里的解决方案确实是激活“分类”映射。 scatterplot
的legend
参数可以取三个值
legend
:“简要”,“完整”或False,可选
如何绘制图例。如果为“简短”,则数字色相和大小变量将以均匀间隔的值的样本表示。如果“满”,每个组将在图例中获得一个条目。如果为False,则不会添加图例数据,也不会绘制图例。
这样(至少在这种情况下),您可以设置
legend="full"
在hue列中获得每个唯一值的图例条目(因此比使用“ brief”少一个)。
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()