I would like to plot a 2D kernel density estimation. I find the seaborn package very useful here. However, after searching for a long time, I couldn't figure out how to make the y-axis and x-axis non-transparent. Also, how to show the values of the density on the contour? I would be very appreciated if someone could help me out. Below please see my code and graph.
import numpy as np import seaborn as sns import matplotlib.pyplot as pl Y = np.random.multivariate_normal((0, 0), [[0.8, 0.05], [0.05, 0.7]], 100) ax = sns.kdeplot(Y, shade = True, cmap = "PuBu") ax.patch.set_facecolor('white') ax.collections[0].set_alpha(0) ax.set_xlabel('$Y_1$', fontsize = 15) ax.set_ylabel('$Y_0$', fontsize = 15) pl.xlim(-3, 3) pl.ylim(-3, 3) pl.plot([-3, 3], [-3, 3], color = "black", linewidth = 1) pl.show()
Kdeplot is a Kernel Distribution Estimation Plot which depicts the probability density function of the continuous or non-parametric data variables i.e. we can plot for the univariate or multiple variables altogether. Using the Python Seaborn module, we can build the Kdeplot with various functionality added to it.
Here is a solution using scipy
and matplotlib
only :
import numpy as np import matplotlib.pyplot as pl import scipy.stats as st data = np.random.multivariate_normal((0, 0), [[0.8, 0.05], [0.05, 0.7]], 100) x = data[:, 0] y = data[:, 1] xmin, xmax = -3, 3 ymin, ymax = -3, 3 # Peform the kernel density estimate xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j] positions = np.vstack([xx.ravel(), yy.ravel()]) values = np.vstack([x, y]) kernel = st.gaussian_kde(values) f = np.reshape(kernel(positions).T, xx.shape) fig = pl.figure() ax = fig.gca() ax.set_xlim(xmin, xmax) ax.set_ylim(ymin, ymax) # Contourf plot cfset = ax.contourf(xx, yy, f, cmap='Blues') ## Or kernel density estimate plot instead of the contourf plot #ax.imshow(np.rot90(f), cmap='Blues', extent=[xmin, xmax, ymin, ymax]) # Contour plot cset = ax.contour(xx, yy, f, colors='k') # Label plot ax.clabel(cset, inline=1, fontsize=10) ax.set_xlabel('Y1') ax.set_ylabel('Y0') pl.show()
The previous code gives the following result :
which has a non-transparent x-axis, a non-transparent y-axis and values of the density on the contour. Is this the expected result ?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With