如何在 matplotlib/seaborn 中绘制每个子集的值计数?

我对 matplotlib 比较陌生,可能有更好的方法来处理这个问题。我试过了sns.countplot(),没有排序选项。所以我尝试用条形图和 pandas 来进行计数:


my_data = pd.DataFrame({'actions': ['buy','buy','buy','observe','consult'] , 'places':['NY','AR','AR','NY','AR']})

fig, axs = plt.subplots(1, 2, figsize = (5,7))

axs = axs.ravel()

for place in my_data['places']: 

    x = 0 

    temp_df = my_data[my_data['places'] == place]

    axs[x] = sns.barplot(y=temp_df.actions.value_counts().index, x=temp_df.actions.value_counts().values, color="#43B8E7",orient = 'h')

    axs[x].set_title(place)

    x=+1

数据看起来像


   actions places

0      buy     NY

1      buy     AR

2      buy     AR

3  observe     NY

4  consult     AR

代码生成以下内容。正如您可能已经假设的那样,我还需要绘制 NY,但是,由于子集化或循环中遗漏的某些内容,它无法正常工作。如何解决这个问题?我觉得这个很简单,但是找不到。

https://img1.mukewang.com/64db3c8f0001822e04520591.jpg

慕妹3146593
浏览 82回答 2
2回答

偶然的你

您是否在寻找:(my_data.groupby('places')['actions']    .value_counts().unstack('places')    .plot.bar(subplots=True))或者类似地:(pd.crosstab(my_data['actions'], my_data['places'])    .plot.bar(subplots=True))输出:如果你想要单杠:(pd.crosstab(my_data['actions'], my_data['places'])    .plot.barh(subplots=True, layout=[1,2]))输出:或者我们可以修复您的代码:fig, axs = plt.subplots(1, 2, figsize = (5,7))axs = axs.ravel()for ax,place in zip(axs,my_data['places'].unique()):     temp_df = my_data[my_data['places'] == place].actions.value_counts()    sns.barplot(y=temp_df.index, x=temp_df,                 color="#43B8E7", ax=ax, orient = 'h')    ax.set_title(place)输出(恕我直言,这不是很好对齐):

眼眸繁星

我会使用facetgrid,因为你已经在使用seaborn:import pandasimport seabornaxgrid = pandas.DataFrame({    'actions': ['buy','buy','buy','observe','consult'] ,    'places':['NY','AR','AR','NY','AR']}).pipe((seaborn.catplot, 'data'),         y="actions", col="places",        order=['buy', 'consult', 'observe'],        kind="count")
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python