seaborn FacetGrid,按行和列分隔的排序条形图

2 投票
1 回答
5113 浏览
提问于 2025-04-18 03:54

给定一些数据:

pt = pd.DataFrame({'alrmV':[000,000,000,101,101,111,111],
                   'he':[e,e,e,e,h,e,e],
                   'inc':[0,0,0,0,0,1,1]})

我想创建一个按行和列分开的条形图。

g = sns.FacetGrid(pt, row='inc', col='he', margin_titles=True)
g.map( sns.barplot(pt['alrmV']), color='steelblue')

这个方法可以用,但我还想添加:

  1. 一个有序的x轴
  2. 只显示数量最多的前两种alrmV类型

为了得到一个有序的x轴,并显示数量前两的类型,我尝试了一些分组的方法,但没能把它放进一个Facet网格里:

grouped = pt.groupby( ['he','inc'] )
grw= grouped['alrmV'].value_counts().fillna(0.) #.unstack().fillna(0.)
grw[:2].plot(kind='bar')

使用FacetGrid时,切片会限制显示的总数量

g.map(sns.barplot(pt['alrmV'][:10]), color='steelblue')

那么我该如何得到一个按行和列分开的条形图,并且是有序的,只显示数量前两的呢?

1 个回答

4

我没能用你提供的数据让例子运行起来,所以我会用一个示例数据集来演示:

import seaborn as sns
tips = sns.load_dataset("tips")

我们将制作一个图表,sex放在列上,smoker放在行上,使用day作为条形图的x变量。为了按顺序获取前两天,我们可以这样做:

top_two_ordered = tips.day.value_counts().order().index[-2:]

然后你可以把这个列表传递给barplot参数。

虽然你可以直接使用FacetGrid,但使用factorplot函数可能会更简单:

g = sns.factorplot("day", col="sex", row="smoker",
               data=tips, margin_titles=True, size=3,
               x_order=top_two_ordered)

这将绘制出:

在这里输入图片描述

虽然我不建议完全按照你提议的那样做(在每个小图中绘制不同x值的条形),但可以通过类似下面的方式实现:

g = sns.FacetGrid(tips, col="sex", row="smoker", sharex=False)

def ordered_barplot(data, **kws):
    x_order = data.day.value_counts().order().index[-2:]
    sns.barplot(data.day, x_order=x_order)

g.map_dataframe(ordered_barplot)

来制作

在这里输入图片描述

撰写回答