Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么Seaborn会在我的数据中创建一个额外的类别?_Python_Pandas_Seaborn - Fatal编程技术网

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

Python 为什么Seaborn会在我的数据中创建一个额外的类别?,python,pandas,seaborn,Python,Pandas,Seaborn,我试图在Python3.6.5下用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

我试图在Python3.6.5下用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()
结果图显示:

我也在没有熊猫的情况下尝试过这个方法,只使用了例如
x=x[:,0],y=x[:,1],hue=x[:,2]
,但结果是一样的

Seaborn医生这样说是关于
hue
参数:

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

但他们并没有澄清什么是“绝对”的意思,或者行为是什么,或者它是如何不同的。我也读过这本书,但还没有找到答案

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

AttributeError: 'str' object has no attribute 'view'
TypeError: data type not understood
为什么图例中有一个额外的
0
类型?对于以后的工作,我怎样才能拥有更有意义的类别标签


读了更多的书,我发现:

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

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

data['type'] = data['type'].astype('category')
…将此数据转换为分类类型,但Seaborn仍给出一个错误:

AttributeError: 'str' object has no attribute 'view'
TypeError: data type not understood
您确实在这里遇到了“数字”颜色映射,这意味着seaborn将尝试使用一个有意义的(对其本身)数据子集来从中创建图例。这将至少是3种不同的颜色

当将数组中的数字
2
替换为较大的数字(例如
900

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

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

所以你可以设置一些不直观的(至少在这种情况下是这样)

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

谢谢!“字符串没问题,但如果它们是数字就不行”这件事完全把我搞砸了。事实上,我认为最好是以重复的形式关闭。我在那边的回答更一般。一个问题在技术上是重复的很好的例子,但问题看起来完全不同。这个问题在技术上是重复的,但另一个问题/答案对我没有帮助。这篇文章真的成功了!