Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Plotting 2D Kernel Density Estimation with Python

Tags:

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. enter image description here

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() 
like image 821
user3698176 Avatar asked May 09 '15 23:05

user3698176


People also ask

How do you plot a KDE plot in Python?

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.


1 Answers

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 :

plot_kernel_density.jpg

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 ?

like image 69
Flabetvibes Avatar answered Oct 30 '22 09:10

Flabetvibes