Jasmina
Jasmina

Reputation: 31

Python: Plot a histogram given the counts (frequencies) and the bins

To illustrate my problem I prepared an example:

First, I have two arrays 'a'and 'b'and I'm interested in their distribution:

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()

This code gives me a histogram with two 'curves'. Now I want to subtract one 'curve' from the other, and by this I mean that I do this for each bin separately:

n3 = n2-n1

I don't need negative counts so:

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

The new histogram curve should be plotted in the same range as the previous ones and it should have the same number of bins. So I have the number of bins and their position (which will be the same as the ones for the other curves, please refer to the block above) and the frequency or counts (n3) that every bins should have. Do you have any ideas of how I can do this with the data that I have?

Upvotes: 3

Views: 1958

Answers (1)

ImportanceOfBeingErnest
ImportanceOfBeingErnest

Reputation: 339120

You can use a step function to plot n3 = n2 - n1. The only issue is that you need to provide one more value, otherwise the last value is not shown nicely. Also you need to use the where="post" option of the step function.

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

Upvotes: 1

Related Questions