我目前堆叠的直方图编码如下:
x_multi = [np.random.randn(n) for n in [10000, 5000, 2000]]
pyplot.hist(x_multi, 10, histtype='barstacked')
但是,我想将每个堆叠条形图缩放到1的高度,以便y轴现在描述每个串联条形图表示的垃圾箱百分比(即每个堆叠条形图的百分比)。像这样:
但是,此图像来自网络上使用硬编码类别的另一个示例(如x轴所示)。可以使用pyplot.hist自动保留正确的装箱和x轴吗?
答案 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)