In RI können Sie die gewünschte Ausgabe erstellen, indem Sie Folgendes tun:
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) kam ich mit einem einfachen Histogramm am nächsten:
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 den Parameter normed = True ausprobiert , konnte aber nur versuchen, einen Gaußschen Wert an das Histogramm anzupassen.
Meine letzten Versuche gab es scipy.stats
und gaussian_kde
folgte Beispielen im Internet, aber ich war bisher erfolglos.
seaborn
WerfenAntworten:
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, dassgaussian_kde
versucht wird, die Bandbreite automatisch abzuleiten . Sie können auf eine Art und Weise mit der Bandbreite spielen, indem Sie die Funktioncovariance_factor
dergaussian_kde
Klasse ändern . Zunächst erhalten Sie Folgendes, ohne diese Funktion zu ändern:Wenn ich jedoch den folgenden Code verwende:
Ich bekomme
Das ist ziemlich nah an dem, was Sie von R bekommen. 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 wurde die Bandbreite verringert. Ich musste_compute_covariance
nach dem Ändern dieser Funktion 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.quelle
set_bandwidth
Methode und einbw_method
Konstruktorargument wurden zu gaussian_kde in scipy 0.11.0 pro Ausgabe 1619Fünf Jahre später, wenn ich "wie man mit Python ein Kernel-Dichtediagramm erstellt" google, wird dieser Thread immer noch oben angezeigt!
Heutzutage ist es viel einfacher, Seaborn zu verwenden , ein Paket, das viele praktische Plotfunktionen und ein gutes Stilmanagement bietet.
quelle
bw=0.5
gegeben ist?bw
Parameter steht für Bandbreite. Ich habe versucht, die Einstellung von OP anzupassen (siehe sein ursprüngliches erstes Codebeispiel). Eine ausführliche Erläuterung derbw
Steuerelemente finden Sie unter en.wikipedia.org/wiki/… . Grundsätzlich wird gesteuert, wie glatt das Dichtediagramm sein soll. Je größer das bw, desto glatter wird es.TypeError: slice indices must be integers or None or have an __index__ method
Option 1:
Verwenden Sie ein
pandas
Datenrahmen-Diagramm (das darauf aufgebaut istmatplotlib
):Option 2:
Verwendung
distplot
vonseaborn
:quelle
pandas.DataFrame
, kannpandas.Series(data).plot(kind='density')
@Anake verwenden, muss df.plot.density nicht als separaten Schritt festlegen; kann einfach in Ihrembw_method
kwarg inpd.Series(data).plot(kind='density', bw_method=0.5)
Vielleicht versuchen Sie etwas wie:
Sie können leicht
gaussian_kde()
durch eine andere Schätzung der Kerneldichte ersetzen .quelle
Das Dichtediagramm kann auch mit matplotlib erstellt werden: Die Funktion plt.hist (data) gibt die für das Dichtediagramm erforderlichen y- und x-Werte zurück (siehe Dokumentation https://matplotlib.org/3.1.1/api/_as_gen/). matplotlib.pyplot.hist.html ). Infolgedessen erstellt der folgende Code mithilfe der matplotlib-Bibliothek ein Dichtediagramm:
Dieser Code gibt das folgende Dichtediagramm zurück
quelle