python - 从使用`pd.Categorical`过滤的数据帧中绘制Python seaborn
问题描述
我正在尝试从我的数据框的子集中绘制一些数据,但它正在为应该被过滤掉的数据绘制空刻度。我知道问题是我用过pd.Categorical()
,但我需要。如何仅绘制过滤后的数据(即仅a1
和a2
)而不绘制额外的刻度?例子:
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()
我需要在绘制之前重新指定类别吗?好像有点奇怪……
解决方案
这似乎是分类类型的效果,即使它们并不总是存在(参见 参考资料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()
推荐阅读
- npm - 安装 PWA Studio 时出现 WrongPackageManagerError
- php - 为什么 mysql 存储过程在一个环境中返回 null 结果而不在另一个环境中返回?
- amazon-s3 - S3 写入访问被拒绝 - 存储桶需要不同的策略
- javascript - 表单提交不起作用 - html、css 和 javascript,也无法隐藏表单
- python - 在 Python 中输入对象命名空间
- asp.net - 如何将所有已下订单保存在 ASP.NET 的“MyOrder”表中
- javascript - 在返回值之前在函数内部添加超时函数
- elasticsearch - 使用 fluent-bit 与 kubernetes 过滤器和 elasticsearch 输出时丢失日志条目
- python - 抓取嵌套类别后无法将产品页面提供给单独的方法
- google-sheets - How to disable copy and paste among cells?