Jak stworzyć wykres gęstości w matplotlib?

W R mogę utworzyć żądane wyjście wykonując:

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

Wykres gęstości w R

W Pythonie (z matplotlib) najbliżej było z prostym histogramem:

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 w matplotlib

Próbowałem również parametr znormalizowany=True ale nie mogłem uzyskać niczego innego niż dopasowanie Gaussa do histogramu.

Moje ostatnie próby były wokół scipy.stats i gaussian_kde, podążając za przykładami w Internecie, ale do tej pory nie powiodło mi się.

Author: unode, 2010-11-10

6 answers

Sven pokazał, jak używać klasy gaussian_kde z Scipy, ale zauważysz, że nie wygląda ona zupełnie jak to, co wygenerowałeś za pomocą R. dzieje się tak dlatego, że gaussian_kde próbuje wywnioskować przepustowość automatycznie. Możesz grać z przepustowością w sposób zmieniając funkcję covariance_factor klasy gaussian_kde. Po pierwsze, oto co otrzymujesz bez zmiany tej funkcji:

alt text

Jednakże, jeśli użyję następującego kodu:

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

I get

alt text

Który jest ładny zbliżony do tego, co dostajesz od R. co ja zrobiłem? gaussian_kde używa zmiennej funkcji covariance_factor do obliczenia jej przepustowości. Przed zmianą funkcji wartość zwracana przez covariance_factor dla tych danych wynosiła ok .5. Obniżenie to obniżyło przepustowość. Musiałem wywołać _compute_covariance po zmianie tej funkcji tak, aby wszystkie czynniki były obliczane poprawnie. Nie jest to dokładna korespondencja z parametrem bw z R, ale mam nadzieję, że pomoże Ci to we właściwym kierunku.

 126
Author: Justin Peel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-03 05:28:45

Pięć lat później, kiedy Wygooglowałem "jak stworzyć wykres gęstości jądra za pomocą Pythona", ten wątek wciąż pojawia się na górze!

Dziś o wiele łatwiejszym sposobem na to jest użycie seaborn , pakietu, który zapewnia wiele wygodnych funkcji kreślenia i dobre zarządzanie stylem.

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)

Tutaj wpisz opis obrazka

 159
Author: Xin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-26 23:57:03

Opcja 1:

Użyj pandas dataframe plot (zbudowany na 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()

Tutaj wpisz opis obrazka

Opcja 2:

Użycie distplot z 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)

Tutaj wpisz opis obrazka

 51
Author: Aziz Alto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-18 02:44:51

Może spróbuj czegoś takiego:

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

Możesz łatwo zastąpić gaussian_kde() innym oszacowaniem gęstości jądra.

 47
Author: Sven Marnach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-11 00:40:13

Wykres gęstości można również utworzyć za pomocą matplotlib: Funkcja plt.hist (data) Zwraca wartości y i x niezbędne dla wykresu gęstości (patrz dokumentacja https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.hist.html ). W rezultacie poniższy kod tworzy wykres gęstości przy użyciu biblioteki matplotlib:

import matplotlib.pyplot as plt
dat=[-1,2,1,4,-5,3,6,1,2,1,2,5,6,5,6,2,2,2]
a=plt.hist(dat,density=True)
plt.close()
plt.figure()
plt.plot(a[1][1:],a[0])      

Ten kod zwraca następujący wykres gęstości

Tutaj wpisz opis obrazka

 1
Author: tetrisforjeff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-30 01:00:11

Możesz zrobić coś takiego:

s = np.random.normal(2, 3, 1000)
import matplotlib.pyplot as plt
count, bins, ignored = plt.hist(s, 30, density=True)
plt.plot(bins, 1/(3 * np.sqrt(2 * np.pi)) * np.exp( - (bins - 2)**2 / (2 * 3**2) ), 
linewidth=2, color='r')
plt.show()
 0
Author: zerryberry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-23 17:02:28