Цветной шейп-файл с использованием нескольких атрибутов

library(raster)
admin <- getData('GADM', country='FRA', level=2)

set.seed(123)

id <- data.frame(ID_2 = admin@data$ID_2, day1 = sample(1:20,96,replace = T), 
                                   day2 = sample(50:80,96,replace = T), 
                                   day3 = sample(120:140,96,replace = T), 
                                   day4 = sample(200:230,96,replace = T))

 admin.shp <- merge(admin,id)

Если я хочу покрасить сюжет, используя либо day1, day2, day3 или же day4, Я могу сделать это:

plot(admin.shp, col = admin.shp@data$day1)

То, что я пытаюсь сделать, это создать какой-то файл.gif или анимацию, которая длится со дня 1 до дня 230:

  range <- c(min(id$day1),max(id$day4))

Если день соответствует значениям в day1, многоугольник должен стать зеленым, если в день2 он совпадает с тем, что многоугольник должен стать синим, если он совпадает с днем3, этот многоугольник должен стать оранжевым, если он совпадает в день4, этот многоугольник должен стать красным

Если бы мне пришлось сделать это для одного столбца (например, день1), я могу сделать это:

library(magick)
c(min(id$day1),max(id$day1)) # 1, 20  

for(i in 1:20){

   breaks.pl <- c(0, i, 21) 
   col.pl <- c("green4","white")
   cuts.pl <- cut(data.frame(admin.shp)[, "day1"],breaks = breaks.pl)

   png(paste0(i,".png"), width = 1000, height = 600)
   plot(admin.shp, col = col.pl[cuts.pl], border = 'transparent', main = paste0("day:",i))
   plot(admin.shp, add = T)
   dev.off()
 }  

Это создаст серию PNG-файлов, и я смогу сгенерировать.gif из этих 20 PNG-файлов, чтобы создать анимацию для day1

list.png <- list()

for(i in 1:20){
png.file <- image_read(path = paste0(i,".png"))
list.png[[i]] <- png.file
}

png.stack1 <- list.png[[1]]

for(i in 1:20){
    png.stack <- list.png[[i]]
    png.stack1 <- c(png.stack1,png.stack)
 } 

 png.img <- image_scale(png.stack1)
 png.ani <- image_animate(png.img, fps = 1, dispose = "previous")

 image_write(png.ani, "my.animation.gif")

введите описание изображения здесь

Тем не менее, я хочу расширить это так, чтобы я использовал все четыре столбца day1 в day4

1 ответ

Решение

Адаптированный из вашего кода, это должно сработать:

colors = c("white", "green4", "blue", "orange", "red")

library(animation)
ani.options(interval=.05)

i = 0
saveGIF({
  for(k in 2:5){
    while (i < max(id[,k])) {
      print(i)
      i = i + 1 
      breaks.pl <- c(0, i, max(id$day4)+1) 
      col.pl <- c(colors[k], colors[k-1])
      cuts.pl <- cut(data.frame(id)[, k], breaks = breaks.pl)

      plot(admin.shp, col = col.pl[cuts.pl], main = paste0("day:",i))
    } 
  } 
}) 

Демо:

Другие вопросы по тегам