Dans RI peut créer la sortie souhaité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))
En python (avec matplotlib), le plus proche que j'ai obtenu était avec un simple histogramme:
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()
J'ai également essayé le paramètre normed = True mais je n'ai rien pu obtenir d'autre que d'essayer d'adapter un gaussien à l'histogramme.
Mes dernières tentatives étaient autour scipy.stats
et gaussian_kde
, suivant des exemples sur le Web, mais j'ai échoué jusqu'à présent.
seaborn
stackoverflow.com/a/32803224/1922302Réponses:
Sven a montré comment utiliser la classe
gaussian_kde
de Scipy, mais vous remarquerez qu'elle ne ressemble pas tout à fait à ce que vous avez généré avec R. C'est parce qu'ilgaussian_kde
essaie de déduire automatiquement la bande passante. Vous pouvez jouer avec la bande passante d'une certaine manière en modifiant la fonctioncovariance_factor
de lagaussian_kde
classe. Tout d'abord, voici ce que vous obtenez sans changer cette fonction:Cependant, si j'utilise le code suivant:
Je reçois
ce qui est assez proche de ce que vous obtenez de R. Qu'ai-je fait?
gaussian_kde
utilise une fonction modifiablecovariance_factor
pour calculer sa bande passante. Avant de modifier la fonction, la valeur renvoyée par covariance_factor pour ces données était d'environ 0,5. La réduction de 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 bw de R, mais j'espère que cela vous aidera à aller dans la bonne direction.la source
set_bandwidth
méthode et unbw_method
argument de constructeur ont été ajoutés à gaussian_kde dans scipy 0.11.0 par numéro 1619Cinq ans plus tard, quand je Google "comment créer un graphique de densité de noyau en utilisant python", ce fil apparaît toujours en haut!
Aujourd'hui, un moyen beaucoup plus simple de le faire est d'utiliser seaborn , un package qui fournit de nombreuses fonctions de traçage pratiques et une bonne gestion du style.
la source
bw=0.5
est donné?bw
paramètre représente la bande passante. J'essayais de faire correspondre le réglage de OP (voir son premier exemple de code d'origine). Pour une explication détaillée desbw
contrôles, voir en.wikipedia.org/wiki/… . Fondamentalement, il contrôle la fluidité souhaitée du tracé de densité. Plus le pc est grand, plus il sera lisse.TypeError: slice indices must be integers or None or have an __index__ method
Option 1:
Utilisez le
pandas
tracé de dataframe (construit au-dessus dematplotlib
):Option 2:
Utilisation
distplot
deseaborn
:la source
pandas.DataFrame
, peut utiliserpandas.Series(data).plot(kind='density')
@Anake, pas besoin de définir df.plot.density comme étape séparée; peut simplement passer dans votrebw_method
kwarg danspd.Series(data).plot(kind='density', bw_method=0.5)
Essayez peut-être quelque chose comme:
Vous pouvez facilement le remplacer
gaussian_kde()
par une autre estimation de la densité du noyau.la source
Le tracé de densité peut également être créé en utilisant matplotlib: La fonction plt.hist (data) renvoie les valeurs y et x nécessaires au tracé de densité (voir la documentation https://matplotlib.org/3.1.1/api/_as_gen/ matplotlib.pyplot.hist.html ). En conséquence, le code suivant crée un graphique de densité à l'aide de la bibliothèque matplotlib:
Ce code renvoie le graphique de densité suivant
la source