使用ggplot绘制shapefile和动画的gganimate

样本数据

library(raster)
library(ggplot2)

my.shp <- getData('GADM', country = 'FRA', level = 1)
plot(my.shp)

《使用ggplot绘制shapefile和动画的gganimate》

如果我想使用ggplot绘制这些数据:

my.shp_f <- fortify(my.shp, region = "ID_1")
ggplot(data = my.shp_f, aes(long, lat, group = group)) + geom_polygon(fill = "grey80")

《使用ggplot绘制shapefile和动画的gganimate》

问题1:为什么行政边界消失了?

问题2:
我有另一个数据框,每个行政区划从第1天到第365天有2年的每日降雨量数据.

rain.data <- data.frame(ID_1 = rep(my.shp@data$ID_1, each = 2 * 365),
                        year = rep(rep(1981:1982, each = 365), times = 2),
                        day = rep(1:365, times = 4),
                        rain = sample(1:20, replace = T, 2 * 365 * 2))

我想为这个形状文件创建一个每日降雨量的动画
1981年第1天至1982年第365天.

我目前的总体方法是制作一个循环并将每天的降雨量图保存为单独的.png文件,然后将这些文件堆叠为.gif.
但是,这导致我首先节省2年X 365天的.png文件,然后将它们堆叠在一起.如果我有30年的数据,这就变得不可能了.我读过这篇关于gganimate https://github.com/thomasp85/gganimate的帖子,并想知道是否有人可以
演示如何使用上面的数据使用gganimate生成动画地图

最佳答案 这个答案是指向一个不同方向的东西,但我想尝试gganimate,这是一个很好的借口.我的修改主要是使用sf包和ggplot2中的新geom_sf Geom.我不喜欢hacky date fix,所以肯定可以改进.我还只绘制了日期的一个子集 – 根据您的设置,您可能需要一些时间的数据量.无论如何,这是我会做的:

library(raster)
library(ggplot2)
library(sf)
library(dplyr)
library(lubridate)
library(gganimate)
library(rmapshaper)

my.shp <- getData('GADM', country = 'FRA', level = 1)

## Convert the spatial file to sf
my.shp_sf <- st_as_sf(my.shp) %>% 
  ms_simplify()

## Here is how to plot without the rain data
ggplot(my.shp_sf) +
  geom_sf()

## Convert your data into a date
## this is very hacky and coule be improved
rain.data <- data.frame(ID_1 = rep(my.shp@data$ID_1, each = 2 * 365),
                        year = rep(rep(1981:1982, each = 365), times = 2),
                        day = rep(1:365, times = 4),
                        rain = sample(1:20, replace = T, 2 * 365 * 2)) 

date_wo_year <- as.Date(rain.data$day -1, origin = "1981-01-01")
rain.data$Date = ymd(paste0(rain.data$year, "-",month(date_wo_year),"-", day(date_wo_year)))

## Join the rain.data with a properly formatted date with the spatial data. 
joined_spatial <- my.shp_sf %>% 
  left_join(rain.data)

## Plot the spatial data and create an animation
joined_spatial %>% 
  filter(Date < as.Date("1981-02-28")) %>% 
  ggplot() +
  geom_sf(aes(fill = rain)) +
  scale_fill_viridis_c() +
  theme_void() +
  coord_sf(datum = NA) +
  labs(title = 'Date: {current_frame}') +
  transition_manual(Date) 
点赞