In R kann ich die gewünschte Ausgabe erstellen, indem ich Folgendes tue:
data = c(rep(1.5, 7), rep(2.5, 2), rep(3.5, 8),
rep(4.5, 3), rep(5.5, 1), rep(6.5, 8))
plot(density(data, bw=0.5))
In python (mit Matplotlib) war das, was ich am nächsten bekam, mit einem einfachen Histogramm:
import matplotlib.pyplot as plt
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
plt.hist(data, bins=6)
plt.show()
Ich habe auch versucht der normed = True-Parameter , konnte aber nichts anderes als versuchen, einen Gaußschen Wert in das Histogramm einzufügen.
Meine letzten Versuche waren um scipy.stats
und gaussian_kde
, nach Beispielen im Web, aber ich war bisher erfolglos.
Sven hat gezeigt, wie die Klasse gaussian_kde
Von Scipy verwendet wird, aber Sie werden feststellen, dass sie nicht ganz so aussieht, wie Sie sie mit R generiert haben. Dies liegt daran, dass gaussian_kde
Versucht, die Bandbreite automatisch abzuleiten . Sie können in gewisser Weise mit der Bandbreite spielen, indem Sie die Funktion covariance_factor
Der Klasse gaussian_kde
Ändern. Zunächst erhalten Sie Folgendes, ohne diese Funktion zu ändern:
Wenn ich jedoch den folgenden Code verwende:
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import gaussian_kde
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
density = gaussian_kde(data)
xs = np.linspace(0,8,200)
density.covariance_factor = lambda : .25
density._compute_covariance()
plt.plot(xs,density(xs))
plt.show()
Ich bekomme
das kommt dem, was Sie von R bekommen, ziemlich nahe. Was habe ich getan? gaussian_kde
Verwendet eine veränderbare Funktion, covariance_factor
, Um die Bandbreite zu berechnen. Vor dem Ändern der Funktion betrug der von covariance_factor für diese Daten zurückgegebene Wert etwa 0,5. Durch Verringern wird die Bandbreite verringert. Nachdem ich diese Funktion geändert hatte, musste ich _compute_covariance
Aufrufen, damit alle Faktoren korrekt berechnet wurden. Es ist keine exakte Entsprechung mit dem bw-Parameter von R, aber hoffentlich hilft es Ihnen, in die richtige Richtung zu gelangen.
Fünf Jahre später, als ich google, "wie man mit Python ein Kerneldichtediagramm erstellt", wird dieser Thread immer noch oben angezeigt!
Heutzutage ist es viel einfacher, seaborn zu verwenden, ein Paket, das viele praktische Plotterfunktionen und eine gute Stilverwaltung bietet.
import numpy as np
import seaborn as sns
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
sns.set_style('whitegrid')
sns.kdeplot(np.array(data), bw=0.5)
Vielleicht versuchen Sie etwas wie:
import matplotlib.pyplot as plt
import numpy
from scipy import stats
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
density = stats.kde.gaussian_kde(data)
x = numpy.arange(0., 8, .1)
plt.plot(x, density(x))
plt.show()
Sie können gaussian_kde()
einfach durch eine andere Schätzung der Kerneldichte ersetzen.
Option 1:
Verwenden Sie das Diagramm pandas
dataframe (aufgebaut auf matplotlib
):
import pandas as pd
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
pd.DataFrame(data).plot(kind='density') # or pd.Series()
Option 2:
Verwenden Sie distplot
von seaborn
:
import seaborn as sns
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
sns.distplot(data, hist=False)