德克萨斯州地图填充色时序动画制作遇CRS错误求助
错误解释与解决方法
错误原因
Error: arguments have different crs 表示空间数据图层(底图和事件填充层)的坐标系(CRS)不匹配。你的原始代码存在两个核心问题:
- 左连接后的
dat未被正确转换为sf对象,导致几何列的CRS无法在图层间被一致识别 - 底图使用包含31行数据的
dat绘制,重复渲染德克萨斯州多边形,引发CRS处理异常
修正后的代码
library(ggplot2) library(dplyr) library(geodata) library(sf) library(gganimate) library(gifski) # 获取德克萨斯州空间数据 tx <- gadm(country = 'USA', level = 1, path=tempdir()) %>% st_as_sf() %>% filter(NAME_1 %in% 'Texas') %>% mutate(State = NAME_1) %>% select(State, geometry) %>% st_transform(crs = 4269) # 构建事件数据 df1 <- data.frame(matrix(ncol = 4, nrow = 3)) colnames(df1)[1:4] <- c('State','date_start','date_end','event') df1$State <- 'Texas' df1$date_start <- c(as.Date('2020-01-02'), as.Date('2020-01-10'), as.Date('2020-01-16')) df1$date_end <- c(as.Date('2020-01-05'), as.Date('2020-01-13'), as.Date('2020-01-24')) df1$event <- c('moderate','strong','severe') df1 <- left_join(df1, tx, by = 'State') # 构建日期序列 df2 <- data.frame(date = seq.Date(as.Date('2020-01-01'), as.Date('2020-01-31'), 1)) # 合并数据并转换为sf对象 dat <- left_join(df2, df1, by = join_by(between(date, date_start, date_end))) %>% select(date, event, geometry) %>% mutate(geometry = tx$geometry) %>% st_as_sf() # 确保数据具有正确的CRS属性 # 创建底图(仅绘制一次德克萨斯州) base_map <- ggplot() + geom_sf(data = tx, color = "black", fill = "white") + theme_void() # 添加事件图层与动画设置 data_map <- base_map + geom_sf(data = dat, aes(fill = event)) + scale_fill_manual(values = c( moderate = "#f9d56e", strong = "#f79767", severe = "#e04e39" ), na.value = "white") + # 无事件日期保持白色 transition_time(date) + labs(title = "日期: {frame_time}") # 显示当前动画帧日期 # 生成动画 animate(data_map, nframes = 31, renderer = gifski_renderer())
关键修复点
- 统一CRS: 使用
st_as_sf()将dat转换为sf对象,确保其CRS与tx保持一致(EPSG:4269) - 简化底图: 直接使用单多边形的
tx对象作为底图数据源,避免重复渲染 - 处理无事件日期: 通过
na.value = "white"确保无事件日期的填充色与底图一致 - 添加时间标题: 动画标题显示当前日期,明确时序变化
内容的提问来源于stack exchange,提问作者tassones
相关产品推荐
相关产品推荐

