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))
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()
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ę.
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:
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
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.
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)
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()
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)
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.
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
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()
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