Pandas 并排堆积条形图

Posted

技术标签:

【中文标题】Pandas 并排堆积条形图【英文标题】:Pandas side-by-side stacked bar plot 【发布时间】:2018-05-09 17:24:09 【问题描述】:

我想创建titanic dataset 的堆积条形图。情节需要按“Pclass”、“Sex”和“Survived”分组。我已经设法通过大量繁琐的 numpy 操作来生成下面的标准化图(其中“M”是男性,“F”是女性)

有没有办法使用 pandas 内置的绘图功能来做到这一点?

我试过这个:

import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('train.csv')
df_grouped = df.groupby(['Survived','Sex','Pclass'])['Survived'].count()
df_grouped.unstack().plot(kind='bar',stacked=True,  colormap='Blues', grid=True, figsize=(13,5));

这不是我想要的。反正有没有使用熊猫绘图来制作第一个情节?提前致谢

【问题讨论】:

【参考方案1】:

生成的条形不会像第一个图中那样彼此相邻,但除此之外,pandas 可以让你做你想做的事情,如下所示:

df_g = df.groupby(['Pclass', 'Sex'])['Survived'].agg([np.mean, lambda x: 1-np.mean(x)])
df_g.columns = ['Survived', 'Died']
df_g.plot.bar(stacked=True)

在这里,补丁的水平分组由于堆叠的要求而变得复杂。例如,如果我们只关心“Survived”的值,pandas 可以开箱即用地处理它。

df.groupby(['Pclass', 'Sex'])['Survived'].mean().unstack().plot.bar()

如果一个临时解决方案足以对情节进行后处理,那么这样做也不是非常复杂:

import numpy as np
from matplotlib import ticker

df_g = df.groupby(['Pclass', 'Sex'])['Survived'].agg([np.mean, lambda x: 1-np.mean(x)])
df_g.columns = ['Survived', 'Died']
ax = df_g.plot.bar(stacked=True)

# Move back every second patch
for i in range(6):
    new_x = ax.patches[i].get_x() - (i%2)/2
    ax.patches[i].set_x(new_x)
    ax.patches[i+6].set_x(new_x)

# Update tick locations correspondingly
minor_tick_locs = [x.get_x()+1/4 for x in ax.patches[:6]]
major_tick_locs = np.array([x.get_x()+1/4 for x in ax.patches[:6]]).reshape(3, 2).mean(axis=1)
ax.set_xticks(minor_tick_locs, minor=True)
ax.set_xticks(major_tick_locs)

# Use indices from dataframe as tick labels
minor_tick_labels = df_g.index.levels[1][df_g.index.labels[1]].values
major_tick_labels = df_g.index.levels[0].values
ax.xaxis.set_ticklabels(minor_tick_labels, minor=True)
ax.xaxis.set_ticklabels(major_tick_labels)

# Remove ticks and organize tick labels to avoid overlap
ax.tick_params(axis='x', which='both', bottom='off')
ax.tick_params(axis='x', which='minor', rotation=45)
ax.tick_params(axis='x', which='major', pad=35, rotation=0)

【讨论】:

感谢您提供大量代码。我更喜欢你的第二个答案:df.groupby(['Pclass', 'Sex'])['Survived'].mean().unstack().plot.bar() 更简单更优雅

以上是关于Pandas 并排堆积条形图的主要内容,如果未能解决你的问题,请参考以下文章

Pandas - 绘制堆积条形图

Pandas 堆积条形图为大型图例重复颜色

Python Pandas 中的聚集堆积条形图 [关闭]

Plotly:如何从单条迹线制作堆积条形图?

使用 matplotlib 绘制堆积条形图,保持 pandas 数据框的顺序,因为它使用 python

按小时重新采样 Pandas DataFrame 并使用 Plotly 绘制堆积条形图