根据百分位数绘制直方图

时间:2019-05-15 12:06:40

标签: python pandas matplotlib visualization percentile

我有一个具有以下结构的框架:

df = pd.DataFrame({'ID': np.random.randint(1, 13, size=1000),
                   'VALUE': np.random.randint(0, 300, size=1000)})

我该如何绘制图形,在X轴上会有百分位数(10%,20%,.. 90%) 并且在Y轴上应该有一定数量的值,该值介于百分位数刻度之间,例如20%-30% 而且每个ID都必须是一个单独的图(还应包含不同的百分位值)

我发现百分位卡住了 q = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8] df.groupby('ID')['VALUE'].quantile(q)

我猜想该图应该看起来像VALUE参数的直方图,但是X轴上的百分比而不是数值

2 个答案:

答案 0 :(得分:1)

q = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]

for name, group in df.groupby('ID'):  # Groupy by ID column
    _, bins = pd.qcut(group.VALUE, q, retbins=True, grid=False)  # Splits data in defined quantiles
    plt.figure()
    group.VALUE.hist(bins=bins)  # Plots histogram of data with specified bins
    ax.set_xticks(q, [f'{str(x) * 100}%' for x in q])  # format ticks (NOT TESTED)   
    plt.show()

此处未捕获输出图,因为它们很多。它会生成您想要的图,但是您还需要调整刻度线和格式。

要获得归一化的图,y轴的范围是0-100%,则需要在绘制之前对数据进行归一化(也许像group.VALUE.count() / df.VALUE.count()

答案 1 :(得分:0)

尝试:

df['Quantile'] = pd.qcut(df.VALUE, q=np.arange(0,1.1,0.1))
tmp_df = df.pivot_table(index='Quantile', columns='ID', aggfunc='count')
tmp_df.plot(kind='bar', subplots=True, figsize=(10,10))
plt.show()

输出,每个子图是每个ID的分位数。

enter image description here