首页 > 解决方案 > 从使用`pd.Categorical`过滤的数据帧中绘制Python seaborn

问题描述

我正在尝试从我的数据框的子集中绘制一些数据,但它正在为应该被过滤掉的数据绘制空刻度。我知道问题是我用过pd.Categorical(),但我需要。如何仅绘制过滤后的数据(即仅a1a2)而不绘制额外的刻度?例子:

import numpy as np
import pandas as pd
data = {'A':['a2', 'a2', 'a2', 'a1', 'a1', 'a1', 'a3', 'a3', 'a3'],
        'B': np.random.normal(0, 1, 9)}

df = pd.DataFrame(data)

df

df
Out[1]: 
    A         B
0  a2 -1.076173
1  a2 -2.574480
2  a2  0.863081
3  a1  1.411732
4  a1 -0.937692
5  a1  0.929105
6  a3 -1.071276
7  a3  0.901292
8  a3  0.740417


# Sort A using pd.categorical
df['A'] = pd.Categorical(df['A'], ['a1', 'a2', 'a3'])
df = df.sort_values(by='A')

plotdf = df.loc[df['A']!='a3']

plotdf现在应该是df...的一个子集,它是:

plotdf
Out[2]: 
    A         B
3  a1  1.411732
4  a1 -0.937692
5  a1  0.929105
0  a2 -1.076173
1  a2 -2.574480
2  a2  0.863081

但是当我们绘制它时,它保留了过滤掉的刻度位置:

import matplotlib.pyplot as plt
import seaborn as sns

fig, ax = plt.subplots()
sns.barplot(x='A', y='B', data=plotdf)
plt.show()

在此处输入图像描述

我需要在绘制之前重新指定类别吗?好像有点奇怪……

标签: pythonpandasmatplotlibseaborn

解决方案


这似乎是分类类型的效果,即使它们并不总是存在(参见 参考资料print(plotdf['A'].dtype)),它也会保留所有可能的值。

例如,运行plotdf.groupby('A').size()返回

A
a1    3
a2    3
a3    0

a3尽管数据框中不存在类别,但仍显示类别。

在任何情况下,如果您不想在绘图上看到这个空白区域,您可以使用order=参数告诉 seaborn 要绘制哪些类别:

sns.barplot(x='A', y='B', data=plotdf, order=['a1', 'a2'])

请注意,如果你想要通用,你可以这样做order=plotdf['A'].unique()


推荐阅读