Python 为什么Seaborn会在我的数据中创建一个额外的类别?
我试图在Python3.6.5下用0.9.0绘制一些简单的数据。数据只是两个彼此分类不同的点。分类本身就是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
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()
谢谢!“字符串没问题,但如果它们是数字就不行”这件事完全把我搞砸了。事实上,我认为最好是以重复的形式关闭。我在那边的回答更一般。一个问题在技术上是重复的很好的例子,但问题看起来完全不同。这个问题在技术上是重复的,但另一个问题/答案对我没有帮助。这篇文章真的成功了!