10 votos

La animación del efecto de los cambios en el kernel de ancho en R

Tengo algunos datos en R, se almacenan en una lista. Creo

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

aunque este no es de mis datos. Si a continuación, escriba el comando

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

luego me pongo el kernel de densidad de probabilidad, estimación, donde el núcleo es normal estándar. Si puedo reemplazar 1 con otros números, por supuesto, el panorama cambia.

Lo que me gustaría hacer es crear un video o una animación en la que cada fotograma es una parcela, pero el ancho de banda del núcleo varía de fotograma a fotograma, lo que muestra el efecto de cambiar el ancho de banda. ¿Cómo puedo hacer esto?

(Mis disculpas si este no es el lugar correcto para hacer preguntas acerca de la R.)

11voto

giulio Puntos 166

Depende un poco de lo que su objetivo final es.

Rápido y sucio hack para el tiempo real manifestaciones

El uso de Sys.sleep(seconds) en un bucle donde seconds indica el número de segundos entre cuadros es una opción viable. Tendrás que ajustar el xlim y ylim parámetros en la llamada a plot para hacer que las cosas se comportan como se esperaba.

He aquí algunos simples código de demostración.

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

Esto funciona bastante bien, especialmente el uso de X-Windows como el sistema de ventanas. Me he encontrado con que Mac quartz() no jugar bien, por desgracia.

GIFs Animados

Si usted necesita algo que se puede redistribuir, publicar en una página web, etc., mira el write.gif función en el caTools paquete. Mostrar ayuda sobre write.gif da varios buenos ejemplos, incluyendo un par de animaciones—uno con un muy buen ejemplo de cómo utilizar el conjunto de Mandelbrot.

Ver también aquí y aquí.

Más afinado de control y animaciones más elegante

Hay una animación paquete que se ve bastante capaz. No he utilizado yo mismo, aunque, por lo que no pueden dar recomendaciones concretas de cualquier manera.

Me han visto un par de buenos ejemplos de salida de este paquete y se ven bastante bien. Tal vez uno de los "momentos" es la capacidad de insertar una animación en un archivo PDF.

7voto

Brett Veenstra Puntos 10238

Una manera de hacerlo es utilizar la excelente animación paquete por Yihui Xie. He subido un ejemplo muy simple para mi público cuenta de dropbox: densityplot (voy a quitar este ejemplo en 3 días). ¿Es esto lo que buscas?

La animación fue creada mediante el siguiente 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")

5voto

Kevin Ballard Puntos 88866

Sólo en aras de la exhaustividad, si lo necesitas para una clase de demostración, también quisiera mencionar la manipulate paquete que viene con RStudio. Tenga en cuenta que este paquete depende de RStudio de la interfaz, por lo que no trabajo fuera de ella.

manipulate es bastante genial porque te permite crear algunos reguladores para manipular cualquier elemento en la trama. Esto permitiría hacer algunas fácil y en tiempo real de la demostración en la clase.

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

Otros ejemplos aquí

4voto

Eero Puntos 1612

Aquí es otro enfoque:

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' )

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X