Di RI dapat membuat keluaran yang diinginkan dengan melakukan:
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))
Dalam python (dengan matplotlib) yang paling dekat saya dapatkan adalah dengan histogram sederhana:
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()
Saya juga mencoba parameter normed = True tetapi tidak bisa mendapatkan apa pun selain mencoba menyesuaikan gaussian ke histogram.
Upaya terakhir saya adalah sekitar scipy.stats
dan gaussian_kde
, mengikuti contoh di web, tetapi sejauh ini saya tidak berhasil.
seaborn
Jawaban:
Sven telah menunjukkan bagaimana menggunakan kelas
gaussian_kde
dari Scipy, tetapi Anda akan melihat bahwa itu tidak terlihat seperti yang Anda hasilkan dengan R. Ini karenagaussian_kde
mencoba menyimpulkan bandwidth secara otomatis. Anda dapat bermain dengan bandwidth dengan cara dengan mengubah fungsicovariance_factor
darigaussian_kde
kelas. Pertama, inilah yang Anda dapatkan tanpa mengubah fungsi itu:Namun, jika saya menggunakan kode berikut:
saya mendapat
yang cukup dekat dengan apa yang Anda dapatkan dari R. Apa yang telah saya lakukan?
gaussian_kde
menggunakan fungsi yang dapat diubah,covariance_factor
untuk menghitung bandwidthnya. Sebelum mengubah fungsi, nilai yang dikembalikan oleh covariance_factor untuk data ini adalah sekitar 0,5. Menurunkan ini menurunkan bandwidth. Saya harus menelepon_compute_covariance
setelah mengubah fungsi itu sehingga semua faktor akan dihitung dengan benar. Ini bukan korespondensi yang tepat dengan parameter bw dari R, tetapi mudah-mudahan ini membantu Anda mendapatkan arah yang benar.sumber
set_bandwidth
metode danbw_method
argumen konstruktor ditambahkan ke gaussian_kde di scipy 0.11.0 per masalah 1619Lima tahun kemudian, ketika saya Google "cara membuat plot kepadatan kernel menggunakan python", utas ini masih muncul di bagian atas!
Saat ini, cara yang jauh lebih mudah untuk melakukannya adalah dengan menggunakan seaborn , sebuah paket yang menyediakan banyak fungsi plot yang nyaman dan manajemen gaya yang baik.
sumber
bw=0.5
diberikan?bw
Parameter adalah singkatan dari bandwidth. Saya mencoba untuk mencocokkan pengaturan OP (lihat contoh kode pertama aslinya). Untuk penjelasan rinci tentangbw
kontrol apa , lihat en.wikipedia.org/wiki/… . Pada dasarnya ini mengontrol seberapa mulus Anda ingin plot kepadatannya. Semakin besar BW, semakin halus jadinya.TypeError: slice indices must be integers or None or have an __index__ method
Pilihan 1:
Gunakan
pandas
plot dataframe (dibangun di atasmatplotlib
):Pilihan 2:
Gunakan
distplot
dariseaborn
:sumber
pandas.DataFrame
, bisa menggunakanpandas.Series(data).plot(kind='density')
@Anake, tidak perlu menyetel df.plot.density sebagai langkah terpisah; dapat meneruskanbw_method
kwarg Anda kepd.Series(data).plot(kind='density', bw_method=0.5)
Mungkin mencoba sesuatu seperti:
Anda dapat dengan mudah mengganti
gaussian_kde()
dengan perkiraan kepadatan kernel yang berbeda.sumber
Plot kepadatan juga dapat dibuat dengan menggunakan matplotlib: Fungsi plt.hist (data) mengembalikan nilai y dan x yang diperlukan untuk plot kepadatan (lihat dokumentasi https://matplotlib.org/3.1.1/api/_as_gen/ matplotlib.pyplot.hist.html ). Hasilnya, kode berikut membuat plot kepadatan dengan menggunakan pustaka matplotlib:
Kode ini mengembalikan plot kepadatan berikut
sumber