pythonnumpymatplotlibhistogram2d

2D histogram where one axis is cumulative and the other is not


Let's say I have instances of two random variables that can be treated as paired.

import numpy as np
x = np.random.normal(size=1000)
y = np.random.normal(size=1000)

Using matplotlib it is pretty easy to make a 2D histogram.

import matplotlib.pyplot as plt
plt.hist2d(x,y)

In 1D, matplotlib has an option to make a histogram cumulative.

plt.hist(x,cumulative=True)

What I would like incorporates elements of both classes. I would like to construct a 2D histogram such that the horizontal axis is cumulative and the vertical axis is not cumulative.

Is there are way to do this with Python/Matplotlib?


Solution

  • You can take advantage of np.cumsum to create your cumulative histogram. First save the output from hist2d, then apply to your data when plotting.

    import matplotlib.pyplot as plt
    import numpy as np
    
    #Some random data
    x = np.random.normal(size=1000)
    y = np.random.normal(size=1000)
    
    #create a figure
    plt.figure(figsize=(16,8))
    
    ax1 = plt.subplot(121) #Left plot original
    ax2 = plt.subplot(122) #right plot the cumulative distribution along axis
    
    #What you have so far
    ax1.hist2d(x,y)
    
    #save the data and bins
    h, xedge, yedge,image = plt.hist2d(x,y)
    
    #Plot using np.cumsum which does a cumulative sum along a specified axis
    ax2.pcolormesh(xedge,yedge,np.cumsum(h.T,axis=1))
    
    plt.show()
    

    enter image description here