【问题标题】:Plotting proportional data derived from numeric in Python在 Python 中绘制从数字派生的比例数据
【发布时间】:2019-02-10 14:45:38
【问题描述】:

我有一个数据框 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?

【问题讨论】:

    标签: python r matplotlib plot seaborn


    【解决方案1】:

    没有内置选项来创建这样的情节。您当然可以通过 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()
    

    【讨论】:

    • 谢谢 - 正是我需要的!
    猜你喜欢
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多