首页 > 解决方案 > 在 seaborn 中使用 catplot 时更改 x-labels 和宽度

问题描述

我有一个示例数据集如下;

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 个值(而不是查看每个方面的所有值),第二,有没有办法使条形有点更宽的。帮助表示赞赏。

标签: pythonseaborn

解决方案


  • 因为您正在使用hueapi 对 的每个值应用唯一的颜色place_category,但它也希望每个类别都在图中,如您的图像所示。
    • 最后一个图是一个 FacetGrid。使用subplot是创建一个的手动方式。
  • 为了仅绘制每个 的顶级n类别Day_Duration,每个绘图都需要单独完成,并使用自定义颜色图。
  • cmap是一个以地点类别为键、颜色为值的字典。使用它是为了有一个图例,并且每个类别的每个图的颜色都相同。
    • 因为我们没有使用绘图自动生成的图例,所以需要手动创建。
  • 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()

在此处输入图像描述


推荐阅读