2015-05-09 10 views
11

Vorrei tracciare una stima della densità del kernel 2D. Trovo che il pacchetto seaborn sia molto utile qui. Tuttavia, dopo aver cercato per molto tempo, non sono riuscito a capire come rendere l'asse y e l'asse x non trasparenti. Inoltre, come mostrare i valori della densità sul contorno? Sarei molto apprezzato se qualcuno potesse aiutarmi. Qui sotto per favore vedi il mio codice e grafico. enter image description hereStima della stima della densità del kernel 2D con Python

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() 
+1

Non sono sicuro di cosa intendi per "rendere l'asse y e l'asse x non trasparenti"; la riga 'ax.collections [0] .set_alpha (0)' sta rendendo trasparente il contorno più basso; se non lo vuoi, non includere quella linea. – mwaskom

risposta

29

Ecco una soluzione usando scipy e matplotlib solo:

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

Il codice precedente fornisce il seguente risultato:

plot_kernel_density.jpg

che ha una non trasparente asse x, un non - asse y trasparente e valori della densità sul contorno. È questo il risultato atteso?

+0

Questo è molto utile! Grazie per la dimostrazione dettagliata. Userò quello che hai fatto qui. – user3698176