堆叠的直方图不会叠加

时间:2014-02-13 20:58:24

标签: python graph matplotlib plot scikit-learn

我正在尝试运行以下代码:

variable_values = #numpy vector, one dimension, 5053 values between 1 and 0.
label_values = #numpy vector, one dimension, 5053 values, discrete value of either 1 OR 0.
x = variable_values[variable_values != '?'].astype(float)
y = label_values[variable_values != '?'].astype(float)

print np.max(x) #prints 0.90101
print np.max(y) #prints 1.0


N = 5053
ind = np.arange(N)    # the x locations for the groups
width = 0.45       # the width of the bars: can also be len(x) sequence
n, bins, patches = plt.hist(x, 5, stacked=True, normed = True)

#Stack the data
plt.figure()
plt.hist(x, bins, stacked=True, normed = True)
plt.hist(y, bins, stacked=True, normed = True)
plt.show()

我想要实现的是以下图表:

enter image description here

根据label的值是1还是0,每个条形图上的颜色分开。

不幸的是我的输出目前是:

Output

这有两件事是不正确的 - 它首先没有恰当地堆叠。其次,Y轴上的值上升到1.6,但我相信Y轴应该保存落入每个子组的数据的数量(因此,如果所有数据的值都是0-0.25的唯一值将显示数据的栏将是第一个。

2 个答案:

答案 0 :(得分:2)

  

variable_values = #numpy vector,one dimension,5053介于1和0之间。

     

label_values = #numpy vector,one dimension,5053 values,discrete   值1或0。

你正在尝试为x和y使用相同的bin。 x可能是0-1不包括边缘。因此,y超出了您正在绘制的垃圾箱范围。

这是1.6,因为你选择了标准化情节。将该参数设置为false以获取实际计数。

这应解决大多数这些问题:

import numpy as np
import matplotlib.pyplot as plt

x = np.random.random(5053)
y = np.random.random_integers(0,1, 5053)

# x = variable_values[variable_values != '?'].astype(float)
# y = label_values[variable_values != '?'].astype(float)

print np.max(x) #prints 0.90101
print np.max(y) #prints 1.0


N = 5053
ind = np.arange(N)    # the x locations for the groups
width = 0.45       # the width of the bars: can also be len(x) sequence
n, bins, patches = plt.hist(x, 5, stacked=True, normed = True)

bins[0] = 0
bins[-1] = 1

#Stack the data
plt.figure()
plt.hist(y, bins, stacked=True, normed = False)
plt.hist(x, bins, stacked=True, normed = False)
plt.show()

答案 1 :(得分:2)

我可以建议一个更简单的解决方案:

variable_values=np.random.random(size=5053)
label_values=np.random.randint(0,2, size=5053)
plt.hist(variable_values, label='1')
plt.hist(variable_values[label_values==0], label='0')
plt.legend(loc='upper right')
plt.savefig('temp.png')

enter image description here

实际上,因为label_values是1或0,所以甚至不需要堆叠histgram。只需制作1和0的直方图,然后在顶部叠加0的直方图。

使用堆栈直方图,虽然我更喜欢在有许多不同的类时使用:

plt.hist([variable_values[label_values==1],variable_values[label_values==0]], stacked=True, label=['1', '0'])