[英]Seaborn Catplot only changing the X and Y labels on 1 of the rows
[英]Changing x-labels and width while using catplot in seaborn
我有一个示例数据集如下;
pd.DataFrame({'Day_Duration':['Evening','Evening','Evening','Evening','Evening','Morning','Morning','Morning',
'Morning','Morning','Night','Night','Night','Night','Night','Noon','Noon','Noon',
'Noon','Noon'],'place_category':['Other','Italian','Japanese','Chinese','Burger',
'Other','Juice Bar','Donut','Bakery','American','Other','Italian','Japanese','Burger',\
'American','Other','Italian','Burger','American','Salad'],'Percent_delivery':[14.03,10.61,9.25,8.19,6.89,19.58,10.18,9.14,8.36,6.53,13.60,8.42,\
8.22,7.66,6.67,17.71,10.62,8.44,8.33,7.50]})
目标是绘制以Day_duration
为刻面的刻面条形图,因此总共有 4 个刻面。 我使用以下代码来实现相同的目标,
import seaborn as sns
#g = sns.FacetGrid(top5_places, col="Day_Duration")
g=sns.catplot(x="place_category", y="Percent_delivery", hue='place_category',col='Day_Duration',\
data=top5_places,ci=None,kind='bar',height=4, aspect=.7)
g.set_xticklabels(rotation=90)
附上我得到的图;
我可以在两件事上寻求帮助吗,首先是否可以在每个方面的 x 轴上仅获得 5 个值(而不是查看每个方面的所有值),第二,有没有办法使条形有点更宽的。 帮助表示赞赏。
hue
,所以 api 将唯一的颜色应用于place_category
的每个值,但它也希望每个类别都在 plot 中,如图所示。
subplot
是创建一个的手动方式。n
类别,每个Day_Duration
都需要单独完成,并使用自定义颜色 map。cmap
是一个字典,其中地点类别作为键,colors 作为值。 使用它,因此将有一个图例,并且对于每个 plot,每个类别的颜色都相同。
patches
使用Patch
创建图例中的每个项目。 (例如矩形,与颜色和名称相关联)。import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.patches import Patch
# create a color map for unique values or place
place_cat = df.place_category.unique()
colors = sns.color_palette('husl', n_colors=10)
cmap = dict(zip(place_cat, colors))
# plot a subplot for each Day_Duration
plt.figure(figsize=(16, 6))
for i, tod in enumerate(df.Day_Duration.unique(), 1):
data = df[df.Day_Duration == tod].sort_values(['Percent_delivery'], ascending=False)
plt.subplot(1, 4, i)
p = sns.barplot(x='place_category', y='Percent_delivery', data=data, hue='place_category', palette=cmap)
p.legend_.remove()
plt.xticks(rotation=90)
plt.title(f'Day Duration: {tod}')
plt.tight_layout()
patches = [Patch(color=v, label=k) for k, v in cmap.items()]
plt.legend(handles=patches, bbox_to_anchor=(1.04, 0.5), loc='center left', borderaxespad=0)
plt.show()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.