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