Python pyplot.hist:如何将每个小节缩放为1的总和?

时间:2018-10-22 19:40:40

标签: python matplotlib

我目前堆叠的直方图编码如下:

x_multi = [np.random.randn(n) for n in [10000, 5000, 2000]]
pyplot.hist(x_multi, 10, histtype='barstacked')

但是,我想将每个堆叠条形图缩放到1的高度,以便y轴现在描述每个串联条形图表示的垃圾箱百分比(即每个堆叠条形图的百分比)。像这样:

enter image description here

但是,此图像来自网络上使用硬编码类别的另一个示例(如x轴所示)。可以使用pyplot.hist自动保留正确的装箱和x轴吗?

1 个答案:

答案 0 :(得分:1)

显然,没有简单的解决方案。 最快的方法是使用matplotlib的hist函数来计算直方图,然后对其进行归一化,然后使用bar命令对其进行重新绘制。我现在将其概括为任意数量的堆叠单元。 它还可以计算垃圾箱的实际中心,而不仅仅是边缘。

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
d = np.random.randn(300).reshape(3,100)

def percentage_bar_stack(data, bins=10):
    '''Creates a stacked histogram bar chart using data and a given amount of bins'''
    data_binned, edge_bins, patches = plt.hist(data.T, bins=bins, stacked=True, width=.5)
    plt.title('stacked bar chart, raw')

    real_bins = [(edge_bins[i]+edge_bins[i+1])/2 for i in range(bins)]

    data_binned = np.array(data_binned)
    data_binned /= data_binned.sum(0)

    plt.figure()
    print(data_binned)
    for i in range(len(data_binned)):
        plt.bar(real_bins, data_binned[i], bottom=data_binned[:i].sum(0), width=.5)
    plt.title('normalized to percentage')

percentage_bar_stack(d)

Correct stacked bar chart normalized per bar