根据 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))
我有一个如下所示的数据框, 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))