繁体   English   中英

在 seaborn 中使用 catplot 时更改 x-labels 和宽度

[英]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 中,如图所示。
    • 最后一个图是一个 FacetGrid。 使用subplot是创建一个的手动方式。
  • 为了 plot 只有每个 Day_Duration 的前n类别,每个Day_Duration都需要单独完成,并使用自定义颜色 map。
  • cmap是一个字典,其中地点类别作为键,colors 作为值。 使用它,因此将有一个图例,并且对于每个 plot,每个类别的颜色都相同。
    • 因为我们没有使用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM