2016-07-14 11 views
0

0 0 0 0 3 0 3 0 3 0 3 0 0 0 0 0 0 0 3 0 0 Aufgrund der komplexen Verteilung meiner Daten möchte ich jedoch die Parameter ändern, die zur Berechnung der Dichte verwendet werden. Hier die Ergebnisse mit einigen gefälschten Daten ähnlich wie mir: Density plot : Unwanted result Ich möchte die Dichteberechnungen von gaussian_kde kalibrieren, so dass der linke Teil der Handlung wie folgt aussieht: enter image description here Ich mag es nicht die erste Handlung, weil Die Punktegruppen beeinflussen die Dichte benachbarter Punktgruppen und verhindern, dass ich die Verteilung innerhalb einer Gruppe analysiere. Mit anderen Worten, selbst wenn jede der 8 Gruppen genau die gleiche Verteilung hat, ist diese in der Grafik nicht sichtbar.Wie kann ich die Parameter von Gaussian_kde für ein Streudiagramm ändern, das durch die Dichte in Matplotlib

Ich habe versucht, den Kovarianz_Faktor zu ändern (wie ich einmal für ein 2D-Diagramm der Dichte über x getan habe), aber wenn Gaussian_kde mit mehrdimensionalen Arrays verwendet wird, gibt es ein numpy.darray, nicht ein "scipy.stats.kde. gaussian_kde "Objekt. Außerdem weiß ich nicht einmal, ob das Ändern des covariance_factor es tun wird.

Hier ist mein Blindkode:

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.stats import gaussian_kde 

# Generate fake data 
a = np.random.normal(size=1000) 
b = np.random.normal(size=1000) 

# Data for the first image 
x = np.concatenate((a+10,a+10,a+20,a+20,a+30,a+30,a+40,a+40,a+80)) 
y = np.concatenate((b+10,b-10,b+10,b-10,b+10,b-10,b+10,b-10,b*4)) 

# Data for the second image 
#x = np.concatenate((a+10,a+10,a+20,a+20,a+30,a+30,a+40,a+40)) 
#y = np.concatenate((b+10,b-10,b+10,b-10,b+10,b-10,b+10,b-10)) 

# Calculate the point density 
xy = np.vstack([x,y]) 
z = gaussian_kde(xy)(xy) 

# My unsuccesfull try to modify covariance which would work in 1D with "z = gaussian_kde(x)" 
#z.covariance_factor = lambda : 0.01 
#z._compute_covariance() 

# Sort the points by density, so that the densest points are plotted last 
idx = z.argsort() 
x, y, z = x[idx], y[idx], z[idx] 

fig, ax = plt.subplots() 
ax.scatter(x, y, c=z, s=50, edgecolor='') 
plt.show() 

Die Lösung, die eine andere Dichte Rechner verwenden könnte, ich habe nichts dagegen. Das Ziel ist es, ein Dichtediagramm wie oben gezeigt zu erstellen, wo ich mit den Dichteparametern spielen kann.

Ich verwende Python 3.4.3

+0

Könnten Sie deutlicher erklären, was mit dem ersten Grundstück falsch? Meine Vermutung ist, dass Sie eine weniger "glatte" Dichte schätzen wollen. Dies kann in einem gewissen Ausmaß durch Variieren der Bandbreite des Gauß-Kerns gesteuert werden, beispielsweise durch Übergeben verschiedener Skalarwerte für den Parameter "bw_method =". Bedenken Sie jedoch, dass KDE im Allgemeinen für unimodale Verteilungen am besten funktioniert - Überschmierung ist für komplizierte multimodale Verteilungen wie Ihre mehr oder weniger unvermeidlich. –

+0

1) Ich habe die Frage bearbeitet. 2) Ich wäre an einem Beispiel interessiert, wie man den Parameter bw_method ändern kann. 3) Danke für die Vertriebsberatung. – Gab

Antwort

1

bei Seaborn einen Blick Haben? Es ist nicht genau das, was Sie fragen, aber es hat bereits Funktionen für die Dichte Plots zu erzeugen:

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.stats import kendalltau 
import seaborn as sns 

# Generate fake data 
a = np.random.normal(size=1000) 
b = np.random.normal(size=1000) 

# Data for the first image 
x = np.concatenate((a+10, a+10, a+20, a+20, a+30, a+30, a+40, a+40, a+80)) 
y = np.concatenate((b+10, b-10, b+10, b-10, b+10, b-10, b+10, b-10, b*4)) 

sns.jointplot(x, y, kind="hex", stat_func=kendalltau) 
sns.jointplot(x, y, kind="kde", stat_func=kendalltau) 
plt.show() 

Es gibt: Hexplot und KDEplot

+0

Danke, es ist nicht genau das, was ich suche (weil ich einzelne Punkte verliere), aber ich werde es versuchen und es als eine alternative Lösung behalten! – Gab