Animando o efeito de alterar a largura do kernel no R

10

Eu tenho alguns dados em R, armazenados em uma lista. Pensar

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

embora esses não sejam meus dados. Se eu inserir o comando

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

então recebo a estimativa de densidade de probabilidade do kernel, onde o kernel é padrão normal. Se eu substituir 1 por outros números, é claro que a imagem muda.

O que eu gostaria de fazer é criar um vídeo ou animação em que cada quadro seja um gráfico, mas a largura de banda do kernel varia de quadro para quadro, mostrando o efeito de alterar a largura de banda. Como posso fazer isso?

(Peço desculpas se este não for o lugar certo para fazer perguntas sobre R.)

Michael Lugo
fonte

Respostas:

11

Depende um pouco do seu objetivo final.

Hack rápido e sujo para demonstrações em tempo real

Usar Sys.sleep(seconds)um loop em que secondsindica o número de segundos entre os quadros é uma opção viável. Você precisará definir os parâmetros xlime ylimna sua chamada plotpara fazer com que as coisas se comportem conforme o esperado.

Aqui está um código de demonstração simples.

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

Isso funciona muito bem, especialmente usando o X-Windows como o sistema de janelas. Descobri que o Mac quartz()não é bom, infelizmente.

GIFs animados

Se você precisar de algo que possa ser redistribuído, publicado em uma página da web etc., consulte a write.giffunção no pacote caTools . A exibição da ajuda write.giffornece vários exemplos interessantes, incluindo algumas animações - uma com um exemplo bastante interessante usando o conjunto Mandelbrot.

Veja também aqui e aqui .

Controle mais refinado e animações mais sofisticadas

Existe um pacote de animação que parece bastante capaz. Eu mesmo não o usei, então não posso dar nenhuma recomendação real de qualquer maneira.

Eu tenho visto alguns bons exemplos de saída desse pacote e eles olham muito bom. Talvez um dos "destaques" seja a capacidade de incorporar uma animação em um PDF.

cardeal
fonte
Isso parece funcionar. Na maioria das vezes, estou procurando um hack rápido e sujo para usar nas demonstrações de uma classe que estou ensinando, mas se posso publicá-lo em uma página da Web tanto melhor.
Michael Lugo
Para o quartzo, é mais rápido desenhar um retângulo branco sobre o gráfico existente e redesenhar as linhas. Veja tourr:animate_distum exemplo dessa abordagem.
hadley
7

Uma maneira de ir é usar o excelente pacote de animação de Yihui Xie. Fiz upload de um exemplo muito simples para minha conta pública da caixa de depósito: densityplot (removerei este exemplo em três dias). É isso que você está procurando?

A animação foi criada usando o seguinte código 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
fonte
5

Por uma questão de integridade, se você precisar disso para uma demonstração em classe, eu também mencionaria o manipulatepacote que vem com o RStudio . Observe que este pacote depende da interface do RStudio, portanto, não funcionará fora dele.

manipulateé bem legal porque permite criar rapidamente alguns controles deslizantes para manipular qualquer elemento no gráfico. Isso permitiria fazer algumas demonstrações fáceis e em tempo real na sala de aula.

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

Outros exemplos aqui

nico
fonte
4

Aqui está outra abordagem:

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
fonte