W RI można stworzyć pożą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ższy otrzymałem był 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ż użyć parametru normed = True, ale nie mogłem uzyskać niczego innego niż próba dopasowania gaussa do histogramu.
Moje ostatnie próby były w pobliżu scipy.stats
i gaussian_kde
podążając za przykładami w Internecie, ale jak dotąd mi się nie udało.
seaborn
stackoverflow.com/a/32803224/1922302Odpowiedzi:
Sven pokazał, jak używać klasy
gaussian_kde
z Scipy, ale zauważysz, że nie wygląda to tak, jak to, co wygenerowałeś za pomocą R. Dzieje się tak, ponieważgaussian_kde
próbuje automatycznie wywnioskować przepustowość. Można grać z pasma w sposób, poprzez zmianę funkcjicovariance_factor
wgaussian_kde
klasie. Po pierwsze, oto co otrzymujesz bez zmiany tej funkcji:Jeśli jednak użyję następującego kodu:
dostaję
co jest bardzo zbliżone do tego, co otrzymujesz od R. Co ja zrobiłem?
gaussian_kde
wykorzystuje zmienną funkcjęcovariance_factor
do obliczenia swojej przepustowości. Przed zmianą funkcji wartość zwracana przez covariance_factor dla tych danych wynosiła około 0,5. Obniżenie tego zmniejszyło przepustowość. Musiałem zadzwonić_compute_covariance
po zmianie tej funkcji, aby wszystkie czynniki zostały poprawnie obliczone. Nie jest to dokładna zgodność z parametrem bw z R, ale miejmy nadzieję, że pomaga to we właściwym kierunku.źródło
set_bandwidth
Sposób ibw_method
argumentem konstruktora dodano gaussian_kde w scipy 0.11.0 za numerze 1619Pięć lat później, kiedy wyszukuję w Google „jak stworzyć wykres gęstości jądra za pomocą Pythona”, ten wątek wciąż pojawia się na górze!
Dziś dużo łatwiejszym sposobem na to jest użycie jelita morskiego , pakietu, który zapewnia wiele wygodnych funkcji kreślenia i dobre zarządzanie stylami .
źródło
bw=0.5
jest podane?bw
Parametr oznacza przepustowość. Próbowałem dopasować ustawienia OP (zobacz jego oryginalny przykład pierwszego kodu). Aby uzyskać szczegółowe wyjaśnienie, jakiebw
elementy sterujące, zobacz en.wikipedia.org/wiki/… . Zasadniczo kontroluje, jak gładki ma być wykres gęstości. Im większe bw, tym bardziej gładkie będzie.TypeError: slice indices must be integers or None or have an __index__ method
Opcja 1:
Użyj
pandas
wykresu ramki danych (zbudowanego na wierzchumatplotlib
):Opcja 2:
Skorzystaj
distplot
zseaborn
:źródło
pandas.DataFrame
, można używaćpandas.Series(data).plot(kind='density')
@Anake, nie trzeba ustawiać df.plot.density jako oddzielnego kroku; możesz po prostu przejść w swoimbw_method
kwargu dopd.Series(data).plot(kind='density', bw_method=0.5)
Może spróbuj czegoś takiego:
Możesz łatwo zastąpić
gaussian_kde()
innym oszacowaniem gęstości jądra.źródło
Wykres gęstości można również utworzyć za pomocą matplotlib: Funkcja plt.hist (dane) zwraca wartości y i x niezbędne do sporządzenia 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:
Ten kod zwraca następujący wykres gęstości
źródło