pythonimagenumpyhistogramhistogram2d

Plotting two different image histograms as a single 2D histogram plot


I'm looking to plot the histogram of one uint16 image on the x axis and the histogram of another uint16 image on the y axis, such that I get a colormap of the relationship between them as a 2D plot.

this is the sort of plot I am after

I have tried to form two seperate histograms and then construct the 2D array in a loop however this is failing.

first = np.histogram(img1, bins = 1000)
first = first[0]


second = np.histogram(img2, bins = 1000)
second = second[0]


empty_array = np.zeros((1000,1000), dtype = np.float64)

for i in range(1000):
    for j in range(1000):
        empty_array[i,j] = first[j] + second[1000-j]

Solution

  • If you're trying to study the histogram of two variables and how they relate to each other in a single function, consider reading about multi-variate normal distributions. This would apply to studying distributions of pixels in a image for sure. https://juanitorduz.github.io/multivariate_normal/

    It looks like this is what you were trying to do?:

    import numpy as np
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    import seaborn as sns; sns.set(color_codes=True)
    sns.set_context("notebook")
    sns.set_style("darkgrid")
    
    
    # %% Construct normal distribution data
    n = 100
    hist1 = np.random.normal(0,1,n)
    hist2 = np.random.normal(0,1,n)
    
    # %% Plot distributions on their own axis
    sns.jointplot(x=hist1, y=hist2, kind="kde", space=0)
    

    KDE Plot of multi-variate normal

    A different process than the KDE plot that actually finds the multi-variate PDF that defines your data then plots the PDF. This time hist2 has a different distribution than hist1 which makes the spread on the contour plot different:

    import numpy as np
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    import seaborn as sns; sns.set(color_codes=True)
    sns.set_context("notebook")
    sns.set_style("darkgrid")
    from scipy.stats import multivariate_normal as mvn
    
    # %% Create test data for multivariate PDF
    n = 1000
    hist1 = np.random.normal(0,1,n)
    hist2 = np.random.normal(0,2,n)
    
    # %% Calculate mean and covariance of data
    mean = [hist1.mean(), hist2.mean()]
    cov_mat = np.cov( np.array([hist1, hist2]) )
    
    # %% Create multivariate function with calculated means and covariance
    mv_norm_f = mvn(mean=mean, cov=cov_mat)
    
    # %% Setup ranges of variables for PDF function
    range = np.linspace(-1,1,n)
    x, y = np.meshgrid(range, range, indexing='xy')
    xy = np.empty(x.shape + (2,))
    xy[:, :, 0] = x
    xy[:, :, 1] = y
    print(x.shape)
    print(xy.shape)
    
    # %% Call PDF function on ranges of variables
    z = mv_norm_f.pdf( xy )
    
    # %% Shaded contour plot the PDF
    plt.figure()
    
    plt.contourf(x, y, z)
    
    plt.xlabel("X")
    plt.ylabel("Y")
    plt.colorbar()
    plt.grid('on')
    plt.show()
    
    

    Shaded contour plot of multi-variate PDF