web-dev-qa-db-fra.com

Comment créer un graphique de densité dans matplotlib?

En R, je peux créer la sortie désirée en faisant:

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

Dans python (avec matplotlib), le plus proche que j'ai obtenu était avec un histogramme simple:

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

J'ai aussi essayé le paramètre normed = True mais je n'ai rien pu obtenir d'autre que d'essayer de faire correspondre un gaussien à l'histogramme.

Mes dernières tentatives ont été autour de scipy.stats et gaussian_kde, en suivant des exemples sur le Web, mais j’ai échoué jusqu’à présent.

109
unode

Sven a montré comment utiliser la classe gaussian_kde de Scipy, mais vous remarquerez que cela ne ressemble pas vraiment à ce que vous avez généré avec R. C'est parce que gaussian_kde essaie de déduire automatiquement la bande passante. Vous pouvez jouer avec la bande passante en changeant la fonction covariance_factor du gaussian_kde classe. Tout d’abord, voici ce que vous obtenez sans changer cette fonction:

alt text

Cependant, si j'utilise le code suivant:

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

Je reçois

alt text

ce qui est assez proche de ce que vous obtenez de R. Qu'est-ce que j'ai fait? gaussian_kde utilise une fonction modifiable, covariance_factor pour calculer sa bande passante. Avant de modifier la fonction, covariance_factor renvoyait une valeur d'environ 0,5. Diminuer cela a réduit la bande passante. J'ai dû appeler _compute_covariance après avoir changé cette fonction pour que tous les facteurs soient calculés correctement. Ce n'est pas une correspondance exacte avec le paramètre pc de R, mais j'espère que cela vous aidera à aller dans la bonne direction.

115
Justin Peel

Cinq ans plus tard, lorsque je Google "comment créer un graphe de densité de noyau à l'aide de python", ce fil apparaît toujours au sommet!

De nos jours, un moyen beaucoup plus simple consiste à utiliser seaborn , un package qui offre de nombreuses fonctions de traçage pratiques et une bonne gestion des styles.

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

Peut-être essayer quelque chose comme:

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

Vous pouvez facilement remplacer gaussian_kde() par une autre estimation de la densité du noyau.

44
Sven Marnach

Option 1:

Utilisez pandas plotframe de données (construit sur 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:

Utilisez distplot sur 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