Анимация эффекта изменения ширины ядра в R

10

У меня есть некоторые данные в R, хранящиеся в списке. Считать

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

хотя это не мои данные. Если я тогда введите команду

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

тогда я получаю оценку плотности вероятности ядра, где ядро ​​стандартно нормально. Если я заменю 1 на другие числа, конечно, картина изменится.

Я хотел бы создать видео или анимацию, в которой каждый кадр представляет собой такой сюжет, но пропускная способность ядра варьируется от кадра к кадру, демонстрируя тем самым эффект изменения пропускной способности. Как я могу это сделать?

(Мои извинения, если это не то место, чтобы задавать вопросы о Р.)

Майкл Луго
источник

Ответы:

11

Это немного зависит от вашей конечной цели.

Быстрый и грязный хак для демонстраций в реальном времени

Использование Sys.sleep(seconds)в цикле где secondsуказывает количество секунд между кадрами является жизнеспособным вариантом. Вам необходимо установить xlimи ylimпараметры в вызове , чтобы plotделать вещи так , как ожидалось.

Вот простой демонстрационный код.

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

Это работает довольно хорошо, особенно с использованием X-Windows в качестве оконной системы. Я обнаружил, что Mac quartz()не играет хорошо, к сожалению.

Анимированные картинки

Если вам нужно что-то, что можно распространять, публиковать на веб-странице и т. Д., Посмотрите на write.gifфункцию в пакете caTools . Отображение справки write.gifдает несколько хороших примеров, в том числе несколько анимаций - одна с довольно хорошим примером с использованием набора Мандельброта.

Смотрите также здесь и здесь .

Более тонкая настройка управления и более красивые анимации

Есть анимационный пакет, который выглядит довольно способным. Я сам этим не пользовался, поэтому не могу дать никаких реальных рекомендаций в любом случае.

Я уже видел несколько хороших примеров выхода из этого пакета , и они выглядят довольно хорошо. Возможно, одним из «ярких моментов» является возможность вставлять анимацию в PDF.

кардинальный
источник
Это похоже на работу. Я в основном ищу быстрый и грязный хак для демонстрации в классе, который я преподаю, но если я смогу опубликовать его на веб-странице, тем лучше.
Майкл Луго
Для кварца быстрее нарисовать белый прямоугольник поверх существующего графика, а затем просто перерисовать линии. Смотрите tourr:animate_distпример такого подхода.
Хэдли
7

Один из способов - использовать отличный пакет анимации от Yihui Xie. Я загрузил очень простой пример в свою публичную учетную запись Dropbox: плотность (я удалю этот пример через 3 дня). Это то, что вы ищите?

Анимация была создана с использованием следующего кода 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")
Бернд Вайс
источник
5

Просто для полноты, если вам нужно это для демонстрации класса, я бы также упомянул manipulateпакет, который поставляется с RStudio . Обратите внимание, что этот пакет зависит от интерфейса RStudio, поэтому он не будет работать вне его.

manipulateЭто довольно круто, потому что позволяет быстро создавать слайдеры для манипулирования любым элементом на графике. Это позволило бы провести небольшую демонстрацию в реальном времени в классе.

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

Другие примеры здесь

Nico
источник
4

Вот еще один подход:

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' )
Грег Сноу
источник