【问题标题】:Why is Seaborn creating an extra category in my data? [duplicate]为什么 Seaborn 会在我的数据中创建一个额外的类别? [复制]
【发布时间】:2019-03-23 21:29:21
【问题描述】:

我正在尝试在 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()

结果图显示:

我也尝试过不使用 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

【问题讨论】:

  • 一个问题在技术上是重复的很好的例子,但问题似乎完全不同。
  • 问题在技术上是重复的,但其他问题/答案对我没有帮助。这篇文章做到了!

标签: python pandas seaborn


【解决方案1】:

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

当将数组中的数字2 替换为较大的值时,这可能会变得更加明显,例如900

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

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

这么不直观(至少在这种情况下)你可以设置

legend="full"

为色调列中的每个唯一值获取一个图例条目(因此比使用“简要”少一个)。

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

【讨论】:

  • 谢谢! “字符串还可以,但如果是数字就不行”这件事让我彻底崩溃了。
  • 其实我认为最好是作为重复关闭。我那边的回答要笼统得多。
猜你喜欢
  • 2018-05-15
  • 1970-01-01
  • 2020-08-01
  • 1970-01-01
  • 2013-08-18
  • 2021-07-18
  • 2021-07-17
  • 2016-05-30
  • 2022-10-01
相关资源
最近更新 更多