首页 > 解决方案 > 在 Python 中绘制从数字派生的比例数据

问题描述

我有一个df包含学生和非学生年龄的数据框,看起来像这样:

Subject    Student    Age
001        yes        21
002        yes        45
003        no         61
004        no         37
...

我想绘制 40 岁以下每组的比例。我可以在 R 中做到这一点,plot(factor(age < 40) ~ Student, data = df)这给了我:

在此处输入图像描述

有没有办法在 Python 中复制它,最好使用 matplotlib 或 seaborn?

标签: pythonrmatplotlibplotseaborn

解决方案


没有内置选项来创建这样的情节。您当然可以通过计算相关数字来通过 matplotlib 创建它。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

a = np.random.poisson(lam=40, size=6000)
b = ((a>50).astype(int)+np.random.rand(6000))>0.9
df = pd.DataFrame({"Subject" : np.arange(6000),
                   "Age" : a, "Student" : b})

df["Age>40"] = df["Age"] > 40

def propplot(x, y, data):
    xdata = data[[x,y]].groupby(x)
    xcount = xdata.count()

    fig, axes = plt.subplots(ncols=len(xcount), 
                             gridspec_kw={"width_ratios":list(xcount[y].values)})
    for ax, (n,grp) in zip(axes, xdata):

        ycount = grp.groupby(y).count().T
        ycount /= float(ycount.values.sum())
        ycount.plot.bar(stacked=True, ax=ax, width=1, legend=False)
        ax.set_xlabel(n)
        ax.set_xlim(-.5,.5)
        ax.set_ylim(0,1)
        ax.set_xticks([])
    axes[0].set_ylabel(y)
    axes[0].legend(ncol=100, title=y, loc=(0,1.02))
    fig.text(0.5,0.02, x)

propplot("Student", "Age>40", df)
plt.show()

在此处输入图像描述


推荐阅读