根据 Dataframe 整数列值创建 sns.factorplot 的多个子图

Create Multiple Subplots of sns.factorplot based on Dataframe Integer Column Values

我有一个如下所示的数据框, df_sales:

               ProductCode  Weekly_Units_Sold Is_Promo
  Date

  2015-01-11      1               49.0       No
  2015-01-11      2               35.0       No
  2015-01-11      3               33.0       No
  2015-01-11      4               40.0       No
  2015-01-11      5               53.0       No
    ...          ...                ...      ...
  2015-07-26     313               93.0      No
  2015-07-26     314                4.0      No
  2015-07-26     315                1.0      No
  2015-07-26     316                5.0      No
  2015-07-26     317                2.0      No

想要使用 Sns.factorplot 观察每个 ProductCode 的 Promotime 效果,如下面的代码:

sns.factorplot(data= df_sales,
                x= 'Is_Promo',
                y= 'Weekly_Units_Sold',
                hue= 'ProductCode');

效果很好,但由于在一个 table 中绘制了 317 个产品,因此看起来非常混乱和重叠 table。(https://i.stack.imgur.com/fgrjV.png)

当我使用以下代码拆分数据帧时:

df_sales=df_sales.query('1<=ProductCode<=10')

看起来可读性很好。 https://i.stack.imgur.com/NTQev.png

所以,我想借助 10 个产品代码范围的拆分数据绘制为子图(比如第一个子图 ProductCOde 是 [1-10],第二个 [11-20]..[291-300],[每个子图中的 301-310]、[311-317]。

我失败的尝试:`

g=sns.FacetGrid(df_sales,col='ProductCode')
   g.map(sns.factorplot,'Is_Promo','Weekly_Units_Sold')
   sns.factorplot(data= df_sales,
               x= 'Is_Promo',
               y= 'Weekly_Units_Sold',
               hue= 'ProductCode');

我尝试不拆分为 10 个 ProductCode 范围。 我刚刚尝试为每个 ProductCode 创建子图但是 给我图像尺寸错误。

那么如何创建 sns.factorplot 的子图,根据 ProductCode 范围拆分以获得更易读的结果?

谢谢

您需要为每组产品创建一个具有唯一值的新列。一种简单的方法是使用 pd.cut()

Nproducts = 100
Ngroups = 10
df1 = pd.DataFrame({'ProductCode':np.arange(Nproducts),
                    'Weekly_Units_Sold': np.random.random(size=Nproducts),
                    'Is_Promo':'No'})
df2 = pd.DataFrame({'ProductCode':np.arange(Nproducts),
                    'Weekly_Units_Sold': np.random.random(size=Nproducts),
                    'Is_Promo':'Yes'})
df = pd.concat([df1,df2])
df['ProductGroup'] = pd.cut(df['ProductCode'], Ngroups, labels=False)

之后,您可以基于 ProductGroup 进行分面,并为每个组绘制您想要的任何关系。

g = sns.FacetGrid(data=df, col='ProductGroup', col_wrap=3, hue='ProductCode')
g.map(sns.pointplot, 'Is_Promo', 'Weekly_Units_Sold', order=['No','Yes'])

请注意,这是使用 seaborn v.0.10.0。 factorplot() 在 v.0.9 中重命名为 catplot,因此您可能需要针对版本差异进行调整。

编辑: 要创建图例,我必须稍微修改代码以将 hue 参数移出 FacetGrid:

g = sns.FacetGrid(data=df, col='ProductGroup', col_wrap=3)
g.map_dataframe(sns.pointplot, 'Is_Promo', 'Weekly_Units_Sold', order=['Yes','No'], hue='ProductCode')
for ax in g.axes.ravel():
    ax.legend(loc=1, bbox_to_anchor=(1.1,1))