【问题标题】:Colour shapefile using multiple attributes使用多个属性的颜色 shapefile
【发布时间】:2018-04-14 23:10:30
【问题描述】:
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)

如果我想使用day1day2day3day4 为绘图着色,我可以这样做:

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 文件,然后我可以生成这 20 个 png 文件的 .gif 来为 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")

但是,我想扩展这一点,以便我使用所有四列 day1day4

【问题讨论】:

  • 你能融化id data.frame 给你一列:library(reshape2); id &lt;- melt(id, id.vars = "ID_2") 吗?
  • 我可以熔化色谱柱。但是我该如何创建动画呢?

标签: r plot shapefile default.png .git-folder


【解决方案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))
    } 
  } 
}) 

演示

【讨论】:

  • 快速检查一下:您是否使用与我相同的方式制作了 .gif?
  • 没有。我使用了一个在线工具(为了方便)。
  • 如果可能的话,如果它是免费的,你能给我指点在线工具吗?这将使我的生活更轻松。
  • 我用过这个gifmaker.me(从谷歌搜索结果中随机选择),但我认为它仅限于 200 张图片。这就是我的演示不完整的原因。这类工具非常流行,你应该可以找到另一个没有这个限制的工具。
  • 最简单的解决方案是使用animation 包。请参阅此处的示例:programmingr.com/content/animations-r
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
相关资源
最近更新 更多