Animowanie efektu zmiany szerokości jądra w R

10

Mam pewne dane w R, zapisane na liście. Myśleć

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

chociaż to nie są moje dane. Jeśli następnie wprowadzę polecenie

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

następnie otrzymuję oszacowanie prawdopodobieństwa gęstości jądra, gdzie jądro jest normalnie normalne. Jeśli zastąpię 1 innymi liczbami, obraz oczywiście się zmieni.

Chciałbym stworzyć wideo lub animację, w których każda klatka jest taką fabułą, ale przepustowość jądra zmienia się w zależności od klatki, pokazując w ten sposób efekt zmiany przepustowości. W jaki sposób mogę to zrobić?

(Przepraszam, jeśli to nie jest właściwe miejsce do zadawania pytań na temat R.)

Michael Lugo
źródło

Odpowiedzi:

11

To zależy trochę od tego, jaki jest twój cel końcowy.

Szybki i brudny hack do demonstracji w czasie rzeczywistym

Użycie Sys.sleep(seconds)w pętli, w której secondswskazuje liczbę sekund między ramkami, jest realną opcją. Musisz ustawić parametry xlimi ylimw swoim wywołaniu, plotaby wszystko działało zgodnie z oczekiwaniami.

Oto prosty kod demonstracyjny.

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

Działa to całkiem dobrze, szczególnie przy użyciu X-Windows jako systemu okienkowego. Przekonałem się, że Mac quartz()nie gra niestety nieźle.

Animowane GIF-y

Jeśli potrzebujesz czegoś, co można rozpowszechnić, opublikować na stronie internetowej itp., Spójrz na write.giffunkcję w pakiecie caTools . Wyświetlanie pomocy write.gifdaje kilka fajnych przykładów, w tym kilka animacji - jedna z całkiem dobrym przykładem przy użyciu zestawu Mandelbrota.

Zobacz także tutaj i tutaj .

Bardziej precyzyjne sterowanie i bardziej zaawansowane animacje

Istnieje pakiet animacji , który wygląda całkiem sprawnie. Jednak sam go nie użyłem, więc nie mogę dać żadnych prawdziwych rekomendacji.

Ja już widziałem kilka dobrych przykładów wyjścia z tego pakietu i wyglądają bardzo ładne. Być może jedną z „najważniejszych cech” jest możliwość osadzenia animacji w pliku PDF.

kardynał
źródło
To wydaje się działać. Głównie szukam szybkiego i brudnego hacka do demonstracji w klasie, której nauczam, ale jeśli mogę opublikować go na stronie internetowej, tym lepiej.
Michael Lugo,
W przypadku kwarcu szybciej jest narysować biały prostokąt na istniejącym wykresie, a następnie po prostu narysować linie. Zobacz tourr:animate_distprzykład tego podejścia.
hadley,
7

Jednym ze sposobów jest skorzystanie z doskonałego pakietu animacji autorstwa Yihui Xie. Przesłałem bardzo prosty przykład na moje publiczne konto Dropbox : gęstość wykresu ( usunę ten przykład za 3 dni). Czy tego szukasz?

Animacja została utworzona przy użyciu następującego kodu R:

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
źródło
5

Dla kompletności, jeśli potrzebujesz tego do demonstracji klasowej, chciałbym również wspomnieć o manipulatepakiecie, który jest dostarczany z RStudio . Zauważ, że ten pakiet jest zależny od interfejsu RStudio, więc nie będzie działał poza nim.

manipulatejest całkiem fajny, ponieważ pozwala szybko utworzyć niektóre suwaki do manipulowania dowolnym elementem na wykresie. Pozwoliłoby to na przeprowadzenie łatwej demonstracji w klasie w czasie rzeczywistym .

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

Inne przykłady tutaj

Nico
źródło
4

Oto inne podejście:

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
źródło