Animasi efek mengubah lebar kernel di R

10

Saya memiliki beberapa data dalam R, disimpan dalam daftar. Berpikir

d <- c(1,2,3,4) 

meskipun ini bukan data saya. Jika saya kemudian memasukkan perintah

 plot(density(d, kernel="gaussian", width=1))

kemudian saya mendapatkan estimasi kepadatan probabilitas kernel, di mana kernel adalah standar normal. Jika saya mengganti 1 dengan nomor lain, tentu saja gambarnya berubah.

Apa yang ingin saya lakukan adalah membuat video atau animasi di mana setiap frame adalah plot seperti itu, tetapi bandwidth kernel bervariasi dari frame ke frame, dengan demikian menunjukkan efek mengubah bandwidth. Bagaimana saya bisa melakukan ini?

(Permintaan maaf saya jika ini bukan tempat yang tepat untuk bertanya tentang R.)

Michael Lugo
sumber

Jawaban:

11

Tergantung sedikit pada apa tujuan akhir Anda.

Retas cepat dan kotor untuk demonstrasi waktu-nyata

Menggunakan Sys.sleep(seconds)dalam lingkaran di mana secondsmenunjukkan jumlah detik antara frame adalah opsi yang layak. Anda harus mengatur xlimdan ylimparameter dalam panggilan Anda plotuntuk membuat hal-hal berperilaku seperti yang diharapkan.

Berikut ini beberapa kode demonstrasi sederhana.

# Just a quick test of Sys.sleep() animation

x <- seq(0,2*pi, by=0.01)
y <- sin(x)
n <- 5
pause <- 0.5

ybnds <- quantile(n*y, probs=c(0,1))
x11()

# Draw successively taller sinewaves with a gradually changing color
for( i in 1:n )
{
    plot(x, i*y, type="l", lwd=2, ylim=ybnds, col=topo.colors(2*n)[i])
    Sys.sleep(pause)
}

Ini bekerja cukup baik, terutama menggunakan X-Windows sebagai sistem windowing. Saya telah menemukan bahwa Mac quartz()tidak bermain bagus, sayangnya.

GIF animasi

Jika Anda membutuhkan sesuatu yang dapat didistribusikan kembali, diposting di halaman web, dll., Lihat write.giffungsi dalam paket caTools . Menampilkan bantuan pada write.gifmemberikan beberapa contoh bagus, termasuk beberapa animasi — satu dengan contoh yang cukup bagus menggunakan set Mandelbrot.

Lihat juga di sini dan di sini .

Lebih banyak kontrol yang disempurnakan dan animasi yang lebih bagus

Ada paket animasi yang terlihat cukup mumpuni. Saya belum menggunakannya sendiri, jadi saya tidak bisa memberikan rekomendasi nyata.

Saya telah melihat beberapa contoh output dari paket ini dan mereka terlihat cukup bagus. Mungkin salah satu "highlight" adalah kemampuan untuk menanamkan animasi dalam PDF.

kardinal
sumber
Itu sepertinya berhasil. Saya kebanyakan mencari peretasan yang cepat dan kotor untuk digunakan dalam demonstrasi di kelas yang saya ajarkan, tetapi jika saya dapat mempostingnya di halaman web, itu jauh lebih baik.
Michael Lugo
Untuk kuarsa, lebih cepat menggambar persegi panjang putih di atas plot yang ada dan kemudian menggambar ulang garis. Lihat tourr:animate_distcontoh pendekatan ini.
Hadley
7

Salah satu cara untuk pergi adalah dengan menggunakan paket animasi yang sangat baik oleh Yihui Xie. Saya mengunggah contoh yang sangat sederhana ke akun dropbox publik saya: densityplot (saya akan menghapus contoh ini dalam 3 hari). Apa ini yang kamu cari?

Animasi dibuat menggunakan kode R berikut:

library(animation)
density.ani <- function(){
    i <- 1  
    d <- c(1,2,3,4) 
    while (i <= ani.options("nmax")) {
      plot(density(d, kernel="gaussian", bw = i), ylim = c(0, 0.25))
      ani.pause()
      i <- i + 1
    }
}

saveHTML({
par(mar = c(5, 4, 1, 0.5))
density.ani()
}, nmax = 30, title = "Changing kernel width")
Bernd Weiss
sumber
5

Hanya demi kelengkapan, jika Anda membutuhkan ini untuk demonstrasi kelas, saya juga akan menyebutkan manipulatepaket yang datang dengan RStudio . Perhatikan bahwa paket ini tergantung pada antarmuka RStudio, sehingga tidak akan berfungsi di luarnya.

manipulatecukup keren karena memungkinkan untuk dengan cepat membuat beberapa slider untuk memanipulasi elemen apa pun dalam plot. Ini akan memungkinkan untuk melakukan beberapa demonstrasi yang mudah dan real-time di kelas.

manipulate(
  plot(density(1:10, bw)),
  bw = slider(0, 10, step = 0.1, initial = 1)) 

Contoh lain di sini

nico
sumber
4

Berikut ini pendekatan lain:

library(TeachingDemos)

d <- c(1,2,3,4)

tmpfun <- function(width=1, kernel='gaussian'){
    plot(density(d, width=width, kernel=kernel))
}

tmplst <- list( width=list('slider', init=1, from=.5, to=5, resolution=.1),
    kernel=list('radiobuttons', init='gaussian', values=c('gaussian',
        "epanechnikov","rectangular","triangular","biweight","cosine",
        "optcosine")))

tkexamp( tmpfun, tmplst, plotloc='left' )
Greg Snow
sumber