gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:56:00 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





The `hue` parameter in Seaborn.relplot() skips an integer when given numerical data?

(1 个回答)


2年前关闭。




我试图用 Seaborn 绘制一些简单的数据Python 3.6.5 下的 0.9.0。数据只是两个具有不同分类的点。分类本身很简单12 .然而,当我用 Seaborn 绘制它时,图例显示了三种类型:0 , 12 .

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论点:

Can be either categorical or numeric, although color mapping will behave differently in latter case.



但是他们没有澄清“分类”的含义,或者行为是什么,或者它有什么不同。我还阅读了 categorical data plotting tutorial ,但还没有找到答案。

使用像 '1' 这样的字符串和 '2'在数据中只会导致错误:
AttributeError: 'str' object has no attribute 'view'

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

阅读 categorical data plotting tutorial还有一些,我发现了这个:

If your data have a pandas Categorical datatype, then the default order of the categories can be set there. If the variable passed to the categorical axis looks numerical, the levels will be sorted. But the data are still treated as categorical and drawn at ordinal positions on the categorical axes (specifically, at 0, 1, …) even when numbers are used to label them:



这半解释了这里发生的事情(不是为什么有一个额外的 0 类别),但即使使用 Pandas 分类类型也无济于事。添加
data['type'] = data['type'].astype('category')

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

最佳答案

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

这在替换数字 2 时可能会变得更加明显。在有大东西的数组中,例如900
enter image description here

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

legend : “brief”, “full”, or False, optional
How to draw the legend. If “brief”, numeric hue and size variables will be represented with a sample of evenly spaced values. If “full”, every group will get an entry in the legend. If False, no legend data is added and no legend is drawn.



有点不直观(至少在这种情况下)您可以设置
legend="full"

获取色调列中每个唯一值的图例条目(因此比使用“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

关于python - 为什么 Seaborn 会在我的数据中创建一个额外的类别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52884736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com