Анімація ефекту зміни ширини ядра в 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(), на жаль, не грає добре.

Анімовані GIF

Якщо вам потрібно щось перерозподілити, розмістити на веб-сторінці тощо, перегляньте write.gifфункцію в пакеті caTools . Відображення довідки write.gifнаводить декілька приємних прикладів, включаючи пару анімацій - одна із досить приємним прикладом із використанням набору Мандельброта.

Дивіться також тут і тут .

Більш точна настройка управління та більш фантазійні анімації

Є анімаційний пакет, який виглядає досить здатним. Я сам цим не користувався, тому не можу дати жодних реальних рекомендацій.

Я вже бачив кілька хороших прикладів виходу з цього пакета , і вони виглядають досить добре. Можливо, однією з "родзинок" є можливість вбудувати анімацію в PDF.


Це, здається, працює. Я здебільшого шукаю швидкий і брудний злом, який можна використовувати для демонстрацій в класі, який я викладаю, але якщо я можу розмістити його на веб-сторінці набагато краще.
Майкл Луго

Для кварцу швидше намалювати білий прямокутник над існуючим сюжетом, а потім просто перемалювати лінії. Див. tourr:animate_distПриклад такого підходу.
Хадлі

7

Один із способів - використовувати відмінний пакет анімації від Yihui Xie. Я завантажив дуже простий приклад до свого загальнодоступного облікового запису: щільність (цей приклад я видалю через 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)) 

Інші приклади тут


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' )
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.