Python 使用seaborn和matplotlib的堆叠条形图

Python 使用seaborn和matplotlib的堆叠条形图,python,pandas,matplotlib,seaborn,Python,Pandas,Matplotlib,Seaborn,我不熟悉熊猫和matplotlib,并试图完成以下任务。我有一个如下所示的数据框,它实际上是一个基于比赛日期的球员表现列表 name runs match_date player_id Dockrell, G H 0 2018-06-17 3752 Stirling, P R 81 2018-06-17 3586 O'Brien, K J 28 2018-06-17 3391 McCarthy, B J 0 2018-06-17 456

我不熟悉熊猫和matplotlib,并试图完成以下任务。我有一个如下所示的数据框,它实际上是一个基于比赛日期的球员表现列表

name          runs  match_date  player_id
Dockrell, G H   0   2018-06-17  3752
Stirling, P R   81  2018-06-17  3586
O'Brien, K J    28  2018-06-17  3391
McCarthy, B J   0   2018-06-17  4563
Poynter, S W    0   2018-06-17  4326
Poynter, S W    2   2018-06-17  4326
McCarthy, B J   0   2018-06-17  4563
Shannon, J N K  5   2018-06-17  4219
Shannon, J N K  6   2018-06-17  4219
Stirling, P R   51  2018-06-17  3586
这是我根据以下代码创建的数据子集

match_performance = dataFrame[['name','runs','match_date','player_id']].sort_values('match_date',ascending=False).groupby('player_id').head(5)
sns.set_context({"figure.figsize": (10, 4)})
ax = sns.barplot(x="name", y="runs",  data=match_performance)
ax.set_xticklabels(ax.get_xticklabels(), rotation=90) 

我需要将其绘制为堆叠条或分组条,以根据数据框中的球员id显示最近5场比赛中球员的表现,但我不确定如何根据需要绘制这些数据。

Seaborn的创建者Michael Waskom在Twitter上发布了以下内容:

@randyzwitch我真的不喜欢堆叠条形图,我建议也许 使用种类=点的点图/因子图

-Michael Waskom(@michaelwaskom)2014年9月4日


遗憾的是,答案是否定的。Seaborn中没有用于绘制堆叠条形图的内置功能

虽然这是一个较老的问题,但我是在寻找解决方案时发现的,所以我希望这可能会对某些人有所帮助。使用seaborn实现堆叠酒吧有点棘手,但这应该可以做到

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

def stacked_chart_sns(df, x, y, group_by, palette):
    array_of_dfs = []
    w_0 = None
    for u in df[group_by].unique():
        w = df[df[group_by] == u].copy()
        if w_0 is not None:
            w = w.merge(w_0, how='outer').fillna(0)
            w[group_by] = u
            w[y] = w.apply(lambda x: x[y] + x['y_prev'], axis=1)
            w = w.drop(columns=['y_prev'])
        array_of_dfs += [w]
        w_0 = w.drop(columns=[group_by]).rename(columns={y:'y_prev'}).copy()

    patches = []
    for i, d in enumerate(array_of_dfs[::-1]):
        sns.barplot(x=x, y=y, data=d, color=palette[i])
        patches += [mpatches.Patch(label=list(df[group_by].unique())[::-1][i], color=palette[i])]

    plt.legend(handles=patches, loc = 'upper left', ncol=1, labelspacing=1)
    plt.show()

### use it with - for the example data in the question:
stacked_chart_sns(match_performance, 'match_date', 'runs', 'player_id', sns.color_palette("Spectral"))


请发布您尝试的代码和遇到的问题。这既不是教程,也不是代码编写服务。添加了我用于绘图的代码,但没有获得所需的输出。我无法获得按玩家分组所需的方向。分组依据的变量是什么?您能至少描述一下所需的输出图吗?player_id将是分组变量我知道在seaborn中不可能有堆叠的条形图,这就是为什么我对分组条形图持开放态度的原因,我已经看到了几个示例,但在我的情况下,我无法让它们工作。对不起。我没有从你的问题中得到那种印象。您可以选择一个分组条形图,尽管在这种情况下它会很混乱。不管怎样,请尝试seaborn barplot的色调参数。谢谢代码。我刚刚尝试过这个,但当我在sns.barplot行得到索引超出范围错误时,似乎出现了一些问题。它似乎与代码中的调色板部分有关。我尝试过,但无法修复它,因为没有对代码本身的解释。您是否可以提供帮助?默认情况下,
sns。调色板(“光谱”)
返回5种颜色的调色板。如果您想获得更多(从而避免超出范围的错误),可以将其设置为使用
sns.color\u palete(“spectrum”,10)
生成更多调色板元素,其中10是要生成的颜色数。您还可以稍微调整代码并重写函数,以“检测”它需要多少调色板元素。