使用多个属性的颜色 shapefile
Colour shapefile using multiple attributes
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)
我想做的是制作从第 1 天到第 230 天的某种 .gif 文件或动画:
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")
但是,我想扩展它以便我使用所有四列 day1
到 day4
改编自您的代码,这应该可以解决问题:
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))
}
}
})
演示:
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)
我想做的是制作从第 1 天到第 230 天的某种 .gif 文件或动画:
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")
但是,我想扩展它以便我使用所有四列 day1
到 day4
改编自您的代码,这应该可以解决问题:
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))
}
}
})
演示: