1

我正在尝试使用swarmplot单轴,但数据点的颜色会根据类别而不同。

这是一个例子:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
    
data = [
    (12, 50, 'Free', 'W'),
    (14, 1650, 'Free', 'W'),
    (17, 500, 'Free', 'W'),
    (17, 200, 'Free', 'W'),
    (28, 100, 'Free', 'W'),
    (33, 400, 'IM', 'W'),
    (36, 200, 'Fly', 'W'),
    (48, 100, 'Fly', 'W'),
    (52, 200, 'IM', 'W'),
    (54, 200, 'Back', 'W'),
    (54, 200, 'Breast', 'W'),
    (100, 100, 'Breast', 'W'),
    (100, 100, 'Back', 'W')
]


rank, dist, stroke, gender = zip(*data)
frame = pd.DataFrame(data={'rank': rank, 'distance': dist,
    'stroke': stroke, 'gender': gender})

# this one works, except I don't want to spread the points out
# along the y-axis
# sns.catplot(x='rank', y='distance', hue='stroke', kind='swarm', data=frame)

sns.catplot(x='rank', kind='swarm', data=frame, hue='stroke')
plt.show()

以上失败:

Traceback (most recent call last):
  File "test.py", line 31, in <module>
    sns.catplot(x='rank', kind='swarm', data=frame, hue='stroke')
  File "<...>/python3.6/site-packages/seaborn/categorical.py", line 3765, in catplot
    hue_order = list(map(utils.to_utf8, hue_order))
TypeError: 'NoneType' object is not iterable

有没有办法在不提供y字段的情况下让它工作?

4

2 回答 2

2

hue=必须嵌套在x/下y,因此如果不提供两者,您将无法使用它。

在我看来,显示数据的正确方法是使用y='stroke'

sns.catplot(x='rank', y='stroke', kind='swarm', data=frame)

在此处输入图像描述

如果您真的希望所有点都对齐在一条线上,那么您可以伪造一个通用类别以用于所有点并将其传递给y=. 之后,获得合适的标签只是化妆品的问题:

frame.loc[:,'dummy'] = 'dummy'

g = sns.catplot(x='rank', y='dummy', hue='stroke', kind='swarm', data=frame)
g.axes[0,0].set_ylabel("")
g.axes[0,0].set_yticklabels([""])

在此处输入图像描述

于 2019-06-30T21:40:33.000 回答
0

由于您不希望显示 y 轴,因此您可以sns.countplot()使用sns.catplot().

于 2020-07-25T22:00:35.480 回答