python - 为什么 Seaborn 会在我的数据中创建一个额外的类别?
问题描述
我正在尝试在 Python 3.6.5 下使用Seaborn 0.9.0 绘制一些简单的数据。数据只是彼此分类不同的两个点。分类本身就是1
or 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 的方法,只使用 eg x=X[:,0], y=X[:,1], hue=X[:,2]
,但结果是一样的。
Seaborn 文档对这个hue
论点这么说:
可以是分类的或数字的,尽管在后一种情况下颜色映射的行为会有所不同。
但他们没有澄清“分类”是什么意思,或者行为是什么,或者它有什么不同。我还阅读了分类数据绘图教程,但没有找到答案。
'1'
在数据中使用和之类的字符串'2'
只会导致错误:
AttributeError: 'str' object has no attribute 'view'
0
为什么在图例中有一个额外的“类型” ?而且,对于以后,我怎样才能拥有更有意义的类别标签?
再阅读分类数据绘图教程,我发现了这一点:
如果您的数据具有 pandas Categorical 数据类型,则可以在此处设置类别的默认顺序。如果传递给分类轴的变量看起来是数字的,则级别将被排序。但数据仍被视为分类数据并绘制在分类轴上的序数位置(特别是在 0、1、...),即使使用数字标记它们:
这部分解释了这里发生的事情(不是为什么有一个额外的0
类别),但即使使用 Pandas 分类类型也无济于事。添加
data['type'] = data['type'].astype('category')
...将此数据转换为分类类型,但 Seaborn 仍然给出错误:
TypeError: data type not understood
解决方案
您确实在这里遇到了“数字”颜色映射,这意味着 seaborn 将尝试使用有意义的(对自身而言)数据子集数量来从中创建图例。这将至少是 3 种不同的颜色。
2
当用大的东西替换数组中的数字时,这可能会变得更加明显,例如900
这里的解决方案确实是激活“分类”映射。的legend
参数scatterplot
可以取三个值
legend
: “brief”, “full”, or False, optional
如何绘制图例。如果“简短”,数字色调和大小变量将用均匀间隔值的样本表示。如果“已满”,则每个组都将在图例中获得一个条目。如果为 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()
推荐阅读
- java - sessionFactory.getCurrentSession() 更新没有更新我在 java hql 中的 oracle 表
- javascript - 在 Chrome 上使用 onsearch 但在不支持的浏览器上使用 onsubmit?
- azure - 在 azure api 管理中使用身份验证管理身份标记时不完整的不记名令牌
- javascript - 点击多个按钮进入下一页
- buildbot - 如何使用 buildAdditionalContext 在 Buildbot 上添加更多电子邮件消息?
- python - 在 Python 中嵌套 for 循环以生成字典
- linux - 如何将 grep 和 echo 组合命令作为 shell 脚本中的条件传递
- php - php-fpm 服务无法在solus 上启动。可能是由于 snmp 模块
- zend-framework - 无法使用 css 文件 zf2(Zend\View\HelperPluginManager::get 无法获取或创建 inlineStyle 的实例)
- azure - 可以使用 JWT 令牌在 Azure B2C 中登录消费者吗?