Python:在numpy数组中创建具有多个不同值的堆叠直方图

时间:2017-07-04 13:12:15

标签: python arrays numpy matplotlib scipy

我有以下问题。我有一个包含7列的数组。我想要第1,2和5列的堆叠直方图,因此有3个条形堆叠在一起,每列中有不同元素的数量。因此对于第1列,我有9个值,其中4和1的值为3.在第2列中,我有3个值为3和7个值为4.在第5列中,我有不同数量的值。我有一个appoach但非常脏,我只能绘制第1列和第2列。此外,我想在不同的条形图上绘制一个标签,以显示它们显示的数字。

bestof10=    [4.041970802919708228e-01  4.000000000000000000e+00    4.000000000000000000e+00    6.710000000000000853e+01    5.500000000000000444e-01    4.000000000000000000e+00    6.000000000000000000e+01
    3.730468750000000000e-01    4.000000000000000000e+00    4.000000000000000000e+00    1.932000000000000171e+02    7.000000000000000666e-01    6.000000000000000000e+00    6.200000000000000000e+01
    3.626570915619389823e-01    4.000000000000000000e+00    3.000000000000000000e+00    3.900000000000000000e+01    5.000000000000000000e-01    4.000000000000000000e+00    5.300000000000000000e+01
    3.568320278503046006e-01    4.000000000000000000e+00    4.000000000000000000e+00    8.640000000000000568e+01    6.000000000000000888e-01    7.000000000000000000e+00    6.300000000000000000e+01
    3.527336860670193808e-01    4.000000000000000000e+00    4.000000000000000000e+00    6.780000000000001137e+01    6.000000000000000888e-01    3.000000000000000000e+00    5.900000000000000000e+01
    3.521825396825397081e-01    4.000000000000000000e+00    4.000000000000000000e+00    1.568000000000000114e+02    7.000000000000000666e-01    1.000000000000000000e+00    5.700000000000000000e+01
    3.432835820895522305e-01    3.000000000000000000e+00    4.000000000000000000e+00    8.904999999999999716e+01    6.500000000000000222e-01    7.000000000000000000e+00    4.200000000000000000e+01
    3.374888691006233121e-01    4.000000000000000000e+00    3.000000000000000000e+00    3.194999999999999929e+01    4.500000000000000111e-01    7.000000000000000000e+00    5.600000000000000000e+01
    3.364879074658254643e-01    4.000000000000000000e+00    4.000000000000000000e+00    2.430000000000000000e+02    7.500000000000000000e-01    5.000000000000000000e+00    6.100000000000000000e+01
    3.244781783681214282e-01    4.000000000000000000e+00    3.000000000000000000e+00    8.100000000000001421e+01    6.000000000000000888e-01    6.000000000000000000e+00    5.500000000000000000e+01]

a  = np.bincount(bestof10[:,1].astype(int))
ab = np.nonzero(a)[0]
a = a[ab]
a = tuple(a)

b  = np.bincount(bestof10[:,2].astype(int))
bb = np.nonzero(b)[0]
b  = b[bb]
b = tuple(b)

histogramParas=np.column_stack((a,b))

N = 2

ind = np.arange(N)
width = 0.35 

p1 = plt.bar(ind, histogramParas[0], width, color='r')
p2 = plt.bar(ind, histogramParas[1], width, color='y',bottom=histogramParas[0])

plt.ylabel('Scores')
plt.title('Scores by group and gender')
plt.xticks(ind+width/2., ('Radius', 'FRC') )

plt.show()

enter image description here

修改 应该是这样的:

enter image description here

1 个答案:

答案 0 :(得分:0)

首先,您需要将列表放入2D numpy数组中。如您所知,有多少列很容易:

x = np.array(bestof10)
x = x.reshape(-1, 7)

所以现在你有一个10行7列的2D数组(shape =(10,7))。所以现在你可以用matplotlib轻松绘制直方图。

fig, ax = plt.subplots()
_ = ax.hist([x[:, 1], x[:, 2], x[:, 5]],
            stacked=True, normed=False)

Histogram of columns 1,2 and 5