Python 使用seaborn和matplotlib的堆叠条形图
我不熟悉熊猫和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
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是要生成的颜色数。您还可以稍微调整代码并重写函数,以“检测”它需要多少调色板元素。