Tạo hiệu ứng thay đổi độ rộng kernel trong R


10

Tôi có một số dữ liệu trong R, được lưu trữ trong một danh sách. Suy nghĩ

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

mặc dù đây không phải là dữ liệu của tôi Nếu tôi sau đó nhập lệnh

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

sau đó tôi nhận được ước tính mật độ xác suất kernel, trong đó kernel là chuẩn thông thường. Nếu tôi thay 1 bằng các số khác, tất nhiên ảnh sẽ thay đổi.

Những gì tôi muốn làm là tạo một video hoặc hình động trong đó mỗi khung hình là một âm mưu như vậy, nhưng băng thông của hạt nhân thay đổi từ khung hình này sang khung hình khác, từ đó cho thấy hiệu quả của việc thay đổi băng thông. Tôi có thể làm cái này như thế nào?

(Tôi xin lỗi nếu đây không phải là nơi thích hợp để đặt câu hỏi về R.)

Câu trả lời:


11

Nó phụ thuộc một chút vào mục tiêu cuối cùng của bạn là gì.

Hack nhanh và bẩn cho các cuộc biểu tình thời gian thực

Sử dụng Sys.sleep(seconds)trong một vòng lặp trong đó secondschỉ ra số giây giữa các khung là một tùy chọn khả thi. Bạn sẽ cần phải thiết lập xlimylimcác tham số trong cuộc gọi của mình plotđể khiến mọi thứ hoạt động như mong đợi.

Đây là một số mã trình diễn đơn giả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)
}

Điều này hoạt động khá tốt, đặc biệt là sử dụng X-Windows làm hệ thống cửa sổ. quartz()Thật không may, tôi thấy rằng Mac không chơi tốt, thật không may.

GIF hoạt hình

Nếu bạn cần một cái gì đó có thể được phân phối lại, được đăng trên một trang web, v.v., hãy xem write.gifchức năng trong gói caTools . Hiển thị trợ giúp trên write.gifđưa ra một số ví dụ hay, bao gồm một vài hình ảnh động Một với một ví dụ khá hay bằng cách sử dụng bộ Mandelbrot.

Xem thêm ở đâyở đây .

Điều khiển tốt hơn và hình ảnh động fancier

Có một gói hoạt hình trông khá có khả năng. Mặc dù vậy, tôi đã không sử dụng nó, vì vậy tôi không thể đưa ra bất kỳ khuyến nghị thực sự nào.

Tôi đã thấy một vài ví dụ tốt về đầu ra từ gói này và chúng trông khá đẹp. Có lẽ một trong những "điểm nổi bật" là khả năng nhúng hình ảnh động vào tệp PDF.


Điều đó dường như làm việc. Tôi chủ yếu tìm kiếm một bản hack nhanh và bẩn để sử dụng cho các cuộc biểu tình trong một lớp tôi đang giảng dạy, nhưng nếu tôi có thể đăng nó trên một trang web thì càng tốt.
Michael Lugo

Đối với thạch anh, sẽ nhanh hơn khi vẽ một hình chữ nhật màu trắng trên ô hiện có và sau đó chỉ vẽ lại các đường. Xem tourr:animate_diství dụ về phương pháp này.
hadley

7

Một cách để đi là sử dụng gói hoạt hình tuyệt vời của Yihui Xie. Tôi đã tải lên một ví dụ rất đơn giản vào tài khoản dropbox công khai của mình: Mật độ (tôi sẽ xóa ví dụ này sau 3 ngày). Đây có phải là những gì bạn đang tìm kiếm?

Hoạt hình được tạo bằng mã R sau:

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

Để hoàn thiện, nếu bạn cần điều này cho một cuộc biểu tình của lớp, tôi cũng sẽ đề cập đến manipulategói đi kèm với RStudio . Lưu ý rằng gói này phụ thuộc vào giao diện RStudio, vì vậy nó sẽ không hoạt động bên ngoài nó.

manipulatelà khá mát mẻ vì nó cho phép nhanh chóng tạo ra một số thanh trượt để thao tác bất kỳ yếu tố nào trong cốt truyện. Điều này sẽ cho phép thực hiện một số trình diễn dễ dàng và thời gian thực trong lớp.

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

Các ví dụ khác ở đây


4

Đây là một cách tiếp cận khác:

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' )
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.