bản đồ hoạt hình trong R


9

Mọi người, xin lỗi vì đã làm phiền, nhưng tôi còn khá mới với r phải đối mặt với một vấn đề rất quan trọng: Tôi muốn tạo ra một bản đồ hoạt hình của Nga với những thay đổi về tình trạng thất nghiệp với những năm khác nhau. Trên hình ảnh bạn có thể thấy dữ liệu trong một nămnhập mô tả hình ảnh ở đây

require(sp)
require(maptools)

require(RColorBrewer)
require(rgdal)
 rus<-url("http://www.filefactory.com/file/4h1hb5c1cw7r/n/RUS_adm1_RData")
print(load(rus))


unempl <- read.delim2(file="C:\\unempl1.txt", header = TRUE, 
        sep = ";",quote = "", dec=",", stringsAsFactors=F)

gadm_names <-gadm$NAME_1
total <- length(gadm_names)
pb <- txtProgressBar(min = 0, max = total, style = 3) 

order <- vector()
for (i in 1:total){  

  order[i] <- agrep(gadm_names[i], unempl$region, 
                     max.distance = 0.2)[1]
 setTxtProgressBar(pb, i)               # update progress bar
}


col_no <- as.factor(as.numeric(cut(unempl$data[order],
                    c(0,2.5,5,7.5,10,15,100))))


levels(col_no) <- c("<2,5%", "2,5-5%", "5-7,5%",
                    "7,5-10%", "10-15%", ">15%")


gadm$col_no <- col_no
myPalette<-brewer.pal(6,"Purples")



proj4.str <- CRS("+init=epsg:3413 +lon_0=105")
gadm.prj <- spTransform(gadm, proj4.str)

spplot(gadm.prj, "col_no", col=grey(.9), col.regions=myPalette,
main="Unemployment in Russia by region")

Kết quả mà tôi sẵn sàng nhận được là một cái gì đó giống như hoạt hình ở đây: http://spatial.ly/2011/02/mapping-londons-population-change-2011-2030/ Tuy nhiên, tôi đã googled rất nhiều, đọc một số chủ đề trong http://stackoverflow.com bao gồm các mục sau: Tạo phim từ một loạt các cốt truyện trong R , nhưng không thể làm đúng.

cảm ơn bạn trước

Tôi đã đến với một cái gì đó như thế này, bất cứ ai có thể xin vui lòng cho tôi biết đâu là sai lầm:

require(animation)
    require(sp)
    require(RColorBrewer) 
    require(classInt)     
require(rgdal)
 rus<-url("http://www.filefactory.com/file/4h1hb5c1cw7r/n/RUS_adm1_RData")
print(load(rus))




unempl1 <- read.delim2(file="C:\\unempl11.txt", header = TRUE, 
        sep = ";",quote = "", dec=",", stringsAsFactors=F)
unempl2<- read.delim2(file="C:\\unempl12.txt", header = TRUE, 
        sep = ";",quote = "", dec=",", stringsAsFactors=F)

gadm_names <-gadm$NAME_1


total <- length(gadm_names)
pb <- txtProgressBar(min = 0, max = total, style = 3) 

order <- vector()

for (i in 1:total){  

  order[i] <- agrep(gadm_names[i], unempl1$region, 
                     max.distance = 0.2)[1]
 setTxtProgressBar(pb, i)               # update progress bar
}


for (l in 1:total){  

  order[l] <- agrep(gadm_names[l], unempl2$region, 
                     max.distance = 0.2)[1]
 setTxtProgressBar(pb, i)               # update progress bar
}

col_no_1 <- as.factor(as.numeric(cut(unempl1$data[order],
                    c(0,2.5,5,7.5,10,15,100))))

col_no_2<- as.factor(as.numeric(cut(unempl2$data[order],
                    c(0,2.5,5,7.5,10,15,100))))
saveHTML(
      for(k in 1:2) {
        try<-get(paste("col_no_", k, sep = ""))

levels(try) <- c("<2,5%", "2,5-5%", "5-7,5%",
                    "7,5-10%", "10-15%", ">15%")


gadm$col_no <- try

myPalette<-brewer.pal(6,"Purples")



proj4.str <- CRS("+init=epsg:3413 +lon_0=105")
gadm.prj <- spTransform(gadm, proj4.str)

spplot(gadm.prj, "col_no", col=grey(.9), col.regions=myPalette,
main="Unemployment in Russia by region")
},img.name = "map", htmlfile = "unrus2.html")

Đây là dữ liệu để có thể sao chép mã


Re The edit: điều gì đang xảy ra với mã?
whuber

Vì ví dụ của bạn không thể tái tạo nên rất khó để khắc phục sự cố. Một vài điều nhảy ra 1) bạn đang áp dụng một biến đổi không gian trong một vòng lặp, vì vậy bạn đang thực hiện nó 2 lần) bạn đang tạo một đối tượng gọi là "thử" cũng là hàm R 3) bạn có thể lặp qua các tên cột thực tế ., for (i in c ("Var1", "Var2")) theo cách mà bạn hiện đang mã hóa rất phức tạp 4) cuộc gọi đến spplot của bạn không chính xác, bạn đang chuyển cho nó một vectơ vô nghĩa.
Jeffrey Evans

Tôi thực sự xin lỗi vì không hiểu biết như vậy, nhưng đây là trải nghiệm thực sự đầu tiên của tôi với R, tôi đã thêm dữ liệu vào câu hỏi chính, nếu nó không làm phiền bạn, bạn có thể vui lòng gợi ý các cách để cải thiện vì tôi thực sự chạy ý tưởng
Ruvin Rafailov

Câu trả lời:


4

Đây là xa như tôi đi. Bạn sẽ có thể tìm ra nó dựa trên mã này. Một lần nữa, vì vấn đề của bạn không thể lặp lại, tôi đã phải tạo dữ liệu giả để minh họa cho giải pháp. Một khía cạnh kỳ lạ trong việc sử dụng spplot là vì nó sử dụng mạng tinh thể để tạo ra cốt truyện, bạn cần tạo một đối tượng và sau đó in đối tượng. Nếu không, bạn không có được một âm mưu.

require(animation)
require(sp)
require(RColorBrewer) 
require(classInt)     
require(rgdal)

load(url("http://www.filefactory.com/file/4h1hb5c1cw7r/n/RUS_adm1_RData"))
closeAllConnections()

# Set color palette
myPalette <- brewer.pal(6,"Purples")

# Reproject data
gadm <- spTransform(gadm, CRS("+init=epsg:3413 +lon_0=105"))

# Create dummy unployment data with 10% change in gadm object 
gadm@data$uemp2000 <- runif(dim(gadm)[1],0,50)
gadm@data$uemp2001 <- gadm@data$uemp2000 + (gadm@data$uemp2000 * 0.10) 
gadm@data$uemp2002 <- gadm@data$uemp2001 + (gadm@data$uemp2001 * 0.10) 
gadm@data$uemp2003 <- gadm@data$uemp2002 + (gadm@data$uemp2002 * 0.10) 
gadm@data$uemp2004 <- gadm@data$uemp2003 + (gadm@data$uemp2003 * 0.10) 
gadm@data$uemp2005 <- gadm@data$uemp2004 + (gadm@data$uemp2004 * 0.10) 

# Coerce into factors with defined levels
for( i in c("uemp2000","uemp2001","uemp2002","uemp2003","uemp2004","uemp2005") ) {
  gadm@data[,i] <- as.factor(as.numeric(cut(gadm@data[,i], 
                             c(0,2.5,5,7.5,10,15,100)))) 
    levels(gadm@data[,i]) <- c("<2,5%", "2,5-5%", "5-7,5%",
                               "7,5-10%", "10-15%", ">15%")                          
    } 

saveHTML(
  for(i in c("uemp2000","uemp2001","uemp2002","uemp2003","uemp2004","uemp2005")) {
    sp.plot <- spplot(gadm, i, col=grey(.9), col.regions=myPalette,
                      main=paste("Unemployment in Russia", i, sep=" - ") )
      print( sp.plot )
},img.name = "map", htmlfile = "unrus2.html")

Cảm ơn bạn! Tôi sẽ thử nó ngay lập tức. Chỉ cần một câu hỏi gadm @ data $ uemp2001 <- gadm @ data $ uemp2000 + (gadm @ data $ uemp2000 * 0.10) Tôi có thể tải dữ liệu txt thay vì ngẫu nhiên không, có thể xử lý sự cố không?
Ruvin Rafailov

Vâng, mã đó chỉ liên quan đến việc tạo dữ liệu mẫu. Bạn sẽ muốn sử dụng dữ liệu của riêng bạn.
Jeffrey Evans

9

Hãy xem gói hoạt hình . Một trong những chức năng đáng để khám phá, không yêu cầu phần mềm của bên thứ 3, là "saveHTML".

Sử dụng chức năng "saveHTML" trong gói hoạt hình rất đơn giản. Dưới đây là mã ví dụ nơi tôi tạo một hình ảnh động về sự thay đổi dân số ngẫu nhiên. Đối số "expr" xác định hàm vẽ mà bạn muốn chuyển đến hình động. Như bạn có thể thấy trong đoạn mã dưới đây, tôi đã sử dụng một vòng lặp for để vẽ từng cột mô phỏng.

    require(animation)
    require(sp)
    require(RColorBrewer) 
    require(classInt)     

# Load your data and add random population change column
    load(url("http://www.gadm.org/data/rda/GBR_adm2.RData"))
      for( i in 1:10 ) {
        gadm@data[paste("Year",i, sep="")] <- runif(dim(gadm)[1],0,1) 
       }

# Create HTML animation using for loop for each simulated column    
    saveHTML(
      for(x in names(gadm@data)[19:28]) { 
      ani.options(interval = 0.5)  
       plotvar <- gadm@data[,x]
          nclr <- 9
         plotclr <- rev(brewer.pal(nclr,"BuPu"))
          cuts <- classIntervals(plotvar, style="fixed", 
               fixedBreaks=c(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,1))
               colcode <- findColours(cuts, plotclr)
          plot(gadm, col=colcode, border=NA, ylim=c(bbox(gadm)[,1][2], bbox(gadm)[,2][2]),
            xlim=c(bbox(gadm)[,1][1], bbox(gadm)[,2][1]))
            text(min(bbox(gadm)[1]), min(bbox(gadm)[2]), paste("Population Change",x,sep=" "))
          box()
        legend("topleft", legend=c("0-10%","10-20%","20-30%","30-40%","40-50%",
               "50-60%","60-70%","70-80%","80-100%"),
                 fill=attr(colcode, "palette"), cex=0.6, bty="n")   
        ani.pause() 
        },
           img.name="RandPopChange", htmlfile="SimPopChange.html",
           single.opts = "'controls': ['first', 'previous', 'play', 'next', 'last', 'loop', 'speed'], 'delayMin': 0",      
            description=c("Random population change:"))  

Tôi đã chỉnh sửa bài đăng để cung cấp một ví dụ phù hợp hơn dựa trên các cột đa giác.


Tuy nhiên, cảm ơn bạn, đây là điều đầu tiên tôi thực sự làm, bắt đầu khám phá câu hỏi này, tuy nhiên nó không mang lại cho tôi kết quả vì tôi không thể hiểu biểu thức nào nên là một đối số.
Ruvin Rafailov

Ồ, tôi nghĩ rằng điều đó là phù hợp, sẽ cố gắng tối ưu hóa cho nhu cầu của tôi ngay khi kết thúc việc chuẩn bị dữ liệu. Cảm ơn bạn rất nhiều, ngay khi nó hoạt động tôi sẽ chấp nhận một câu trả lời. Và chỉ là câu hỏi đặt ra ngay lập tức: có thể sử dụng spplot ở đây thay vì cốt truyện, bạn đã thử chưa?
Ruvin Rafailov

Tôi đã chỉnh sửa câu hỏi chính để hiển thị ý tưởng của mình liên quan đến mã của bạn, nhưng tôi chắc chắn rằng tôi đã phạm một số lỗi vì nó không hoạt động đúng. bạn có thể giúp đỡ với điều này?
Ruvin Rafailov

7

Hoạt hình mà bạn liên kết (bên dưới) là một hình ảnh GIF hoạt hình .

nhập mô tả hình ảnh ở đây

Nó thực chất là một loạt các hình ảnh được chuyển qua, tạo hiệu ứng hoạt hình. Hãy nghĩ về nó giống như nhấp qua một loạt các slide, mỗi giây hoặc lâu hơn.

Những gì bạn cần làm để tạo ra hình ảnh động là:

1) Tạo từng "khung" riêng lẻ sẽ được hiển thị.

2) Tạo GIF chính nó. Có một số trang web sẽ làm điều này cho bạn:

http://www.createagif.net/

http://makeagif.com/

Hầu hết các trang web này sẽ cho phép bạn kiểm soát kích thước và tốc độ của hình ảnh động.

Câu hỏi StackOverflow mà bạn liên kết sẽ cung cấp cho bạn mọi thứ bạn cần biết để thực hiện tác vụ này trong R. Lưu ý rằng trước tiên bạn phải cài đặt gói bên thứ 3.

EDIT : Dưới đây là phiên bản cập nhật của mã từ liên kết StackOverflow ở trên vì dường như có một chút nhầm lẫn.

jpeg("/tmp/foo%02d.jpg")
for (i in 1:5) {
  my.plot(i)
}      
make.mov <- function(){
     unlink("plot.mpg")
     system("convert -delay 0.5 plot*.jpg plot.mpg")
}

dev.off()

Đoạn mã trên này lấy từng ô riêng lẻ mà bạn đã tạo trong R và chuyển đổi chúng thành hình động bằng cách lặp qua từng ô và sử dụng ImageMagick , mà bạn phải cài đặt.


Cảm ơn bạn, nhưng tôi là một người có nhu cầu hoạt hình được thực hiện bên trong R mà không có các trang web khác và tôi thực sự không hiểu cách thức mã và ý tưởng này tại stockoverflow hoạt động, nếu không tôi thậm chí sẽ không hỏi
Ruvin Rafailov

Tôi nghĩ rằng câu trả lời trao đổi ngăn xếp có thể hơi khó hiểu vì câu trả lời đã phá vỡ mã với một khối văn bản. Tôi sẽ chỉnh sửa câu trả lời của mình với phiên bản cập nhật của mã đó.
Radar

Cảm ơn đã cập nhật, nhưng vẫn còn một số vấn đề, có thể là ngu ngốc và dễ dàng, nhưng tiếc là tôi không có kinh nghiệm trong việc quản lý chúng. Nếu bạn không phiền tôi sẽ hỏi: 1) jpeg (...) có nghĩa là gì trong mã này? vì Rstudio đưa ra một lỗi không thể mở tệp 2) Rstudio nói về sự không tồn tại của hàm my.plot, mặc dù mọi thứ được tìm ra ở đây đã được cài đặt. Có thể là tôi, người điều hành sai, nếu bạn có thể xin vui lòng cho một số lời khuyên. Cảm ơn trước.
Ruvin Rafailov

2

Đây là câu trả lời, nhờ Oscar Perpiñán.

library(sp)
library(rgdal)
library(spacetime)
library(animation)
rus <- url("http://www.filefactory.com/file/4h1hb5c1cw7r/n/RUS_adm1_RData")
load(rus)
proj4.str <- CRS("+init=epsg:3413 +lon_0=105")
gadm.prj <- spTransform(gadm, proj4.str)
N <- nrow(gadm.prj)
pols <- geometry(gadm.prj)
nms<-gadm$NAME_1
vals1  <- read.csv2("C:\\unempl11.txt")
ord1 <- match(nms, vals1$region)
vals1 <- vals1[ord1,]

vals2 <- read.csv2("C:\\unempl12.txt")
ord2 <- match(nms, vals2$region)
vals2 <- vals2[ord2,]

nDays <- 2
tt <- seq(as.Date('2011-01-01'), by='year', length=nDays)
vals <- data.frame(unempl=rbind(vals1, vals2)[,-1])

gadmST <- STFDF(pols, time=tt, data=vals)



stplot(gadmST, animate=1, do.repeat=FALSE)

saveHTML(stplot(gadmST, animate=1, do.repeat=FALSE)
, img.name = "unemplan",  htmlfile = "unan.html")

Ồ, tôi thích việc sử dụng thư viện không thời gian!
Jeffrey Evans
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.