Python:给出计数(频率)和箱子的直方图

时间:2017-06-27 17:48:09

标签: python matplotlib plot subtraction curves

为了说明我的问题,我准备了一个例子:

首先,我有两个数组'a'和'b',我对它们的发行感兴趣:

import numpy as np
import  matplotlib.pyplot as plt               
a = np.array([1,2,2,2,2,4,8,1,9,5,3,1,2,9])                
b = np.array([5,9,9,2,3,9,3,6,8,4,2,7,8,8])                   
n1,bin1,pat1  = plt.hist(a,np.arange(1,10,2),histtype='step')          
n2,bin2,pat2  = plt.hist(b,np.arange(1,10,2), histtype='step')        
plt.show()

这段代码给了我一个带有两条“曲线”的直方图。现在我想从另一个中减去一个'曲线',我的意思是我分别为每个bin做这个:

n3 = n2-n1

我不需要负数,所以:

for i in range(0,len(n2)):     
    if n3[i]<0:     
        n3[i]=0     
    else:     
        continue    

新的直方图曲线应绘制在与前一个相同的范围内,并且它应具有相同的二进制数。所以我有一些箱子的数量和它们的位置(与其他曲线的位置相同,请参考上面的方块)以及每个箱子应该具有的频率或数量(n3)。您对我如何使用我拥有的数据有任何想法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用步进功能绘制n3 = n2 - n1。唯一的问题是您需要再提供一个值,否则最后一个值不能很好地显示。您还需要使用where="post"函数的step选项。

import numpy as np
import  matplotlib.pyplot as plt               
a = np.array([1,2,2,2,2,4,8,1,9,5,3,1,2,9])                
b = np.array([5,9,9,2,3,9,3,6,8,4,2,7,8,8])                   
n1,bin1,pat1  = plt.hist(a,np.arange(1,10,2),histtype='step')          
n2,bin2,pat2  = plt.hist(b,np.arange(1,10,2), histtype='step')        

n3=n2-n1
n3[n3<0] = 0

plt.step(np.arange(1,10,2),np.append(n3,[n3[-1]]),  where='post', lw=3 )

plt.show()

enter image description here