wake-up-neo.com

Wie erstelle ich ein Dichtediagramm in matplotlib?

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

Density plot in R

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

Histogram in matplotlib

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.

109
unode

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:

alt text

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

alt text

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.

115
Justin Peel

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)

enter image description here

126
Xin

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.

44
Sven Marnach

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

enter image description here

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)

enter image description here

40
Aziz Alto