我有多年来在不同地点观察物种的数据.有些年份没有任何数据.我想创建一张动画 map ,其中包括没有数据的年份,我成功地做到了这一点,但它只是暂时出现.

以下是一些参考资料:

library(sf)
library(ggplot2)
library(gganimate)
library(transformr)
library(tidyr)

rb <- data.frame(YEAR = c(1995, 2000, 2000, 2001, 2002, 2002, 2002, 2004), 
                 TOTAL = c(5, 10, 8, 14, 15, 12, 16, 15),
                 LONG = c(runif(8, -80, -78)),
                 LAT = c(runif(8, 38, 40)))

用我的坐标范围内的一组随机坐标填充缺失的年份:

rb.zero.df <- data.frame(rb %>% 
                           complete(YEAR = full_seq(1995:2004, 1), 
                                    fill = list(LONG = -78.3893, 
                                                LAT = 39.63938, 
                                                TOTAL = 0)))

rb.zero <- st_as_sf(rb.zero.df, coords = c("LONG", "LAT"), crs = 4326)

然后用ifelse表示aesshadow_mark中的alpha,以确保零点不会出现:

rb.zero.map <- ggplot() +
  geom_sf(data = rb.zero, aes(size = TOTAL, alpha = ifelse(TOTAL == 0, 0, 1))) +
  scale_alpha(range = c(0,1)) +
  guides(alpha = "none") +
  transition_states(YEAR, transition_length = 0, state_length = 1) +
  ggtitle("{closest_state}") +
  shadow_mark(alpha = ifelse(rb.zero$TOTAL == 0, 0, 0.25))
animate(rb.zero.map)

这在过go 是可行的,但现在会产生以下错误:

Error in `[[<-.data.frame`(`*tmp*`, i, value = c(0.25, 0, 0, 0, 0, 0.25,  : 
  replacement has 13 rows, data has 12

我不知道如何在这种情况下解释这个错误.

如果我把shadow_mark中的ifelsego 掉,代码就能用了.

我的会话信息:

R version 4.3.2 (2023-10-31)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Ventura 13.3.1

Matrix products: default
BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib 
LAPACK: /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.11.0

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

time zone: America/New_York
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] transformr_0.1.3      gifski_1.12.0-2       gganimate_1.0.7       tidyr_1.3.0          
 [5] viridis_0.6.4         viridisLite_0.4.2     spData_2.3.0          dplyr_1.1.4          
 [9] terra_1.7-65          sf_1.0-15             ggplot2_3.4.4         leaflet.extras2_1.2.2
[13] leaflet_2.2.1         tmap_3.99.9000       

loaded via a namespace (and not attached):
 [1] DBI_1.2.1               gridExtra_2.3           tmaptools_3.1-1         remotes_2.4.2.1        
 [5] rlang_1.1.3             magrittr_2.0.3          e1071_1.7-14            compiler_4.3.2         
 [9] mgcv_1.9-0              png_0.1-8               vctrs_0.6.5             stringr_1.5.1          
[13] profvis_0.3.8           pkgconfig_2.0.3         crayon_1.5.2            fastmap_1.1.1          
[17] ellipsis_0.3.2          labeling_0.4.3          lwgeom_0.2-13           leafem_0.2.3           
[21] utf8_1.2.4              promises_1.2.1          sessioninfo_1.2.2       purrr_1.0.2            
[25] cachem_1.0.8            progress_1.2.3          later_1.3.2             tweenr_2.0.2           
[29] parallel_4.3.2          prettyunits_1.2.0       R6_2.5.1                stringi_1.8.3          
[33] RColorBrewer_1.1-3      pkgload_1.3.4           stars_0.6-4             Rcpp_1.0.12            
[37] usethis_2.2.2           base64enc_0.1-3         leaflet.providers_2.0.0 Matrix_1.6-1.1         
[41] httpuv_1.6.13           splines_4.3.2           tidyselect_1.2.0        rstudioapi_0.15.0      
[45] dichromat_2.0-0.1       abind_1.4-5             codetools_0.2-19        miniUI_0.1.1.1         
[49] pkgbuild_1.4.3          lattice_0.21-9          tibble_3.2.1            leafsync_0.1.0         
[53] plyr_1.8.9              shiny_1.8.0             withr_3.0.0             units_0.8-5            
[57] proxy_0.4-27            urlchecker_1.0.1        lpSolve_5.6.20          pillar_1.9.0           
[61] KernSmooth_2.23-22      generics_0.1.3          sp_2.1-2                hms_1.1.3              
[65] munsell_0.5.0           scales_1.3.0            xtable_1.8-4            class_7.3-22           
[69] glue_1.7.0              tools_4.3.2             leaflegend_1.2.0        data.table_1.14.10     
[73] fs_1.6.3                XML_3.99-0.16.1         grid_4.3.2              crosstalk_1.2.1        
[77] devtools_2.4.5          colorspace_2.1-0        nlme_3.1-163            cols4all_0.7           
[81] raster_3.6-26           cli_3.6.2               fansi_1.0.6             gtable_0.3.4           
[85] digest_0.6.34           widgetframe_0.3.1       classInt_0.4-10         htmlwidgets_1.6.4      
[89] farver_2.1.1            memoise_2.0.1           htmltools_0.5.7         lifecycle_1.0.4        
[93] mime_0.12 

我不知道为什么这个代码以前能用,现在不能用--数据和代码是一样的.对于这个问题和/或失踪年份问题的替代解决方案,我将不胜感激.谢谢!

推荐答案

TL;DR

使用

shadow_mark(alpha = alpha / 4)

而不是

shadow_mark(alpha = ifelse(rb.zero$TOTAL == 0, 0, 0.25))

前言

当我try 您的示例时,我得到了一个不同的错误:

Error: arguments have different crs

但这seems to be a bug in gganimate和临时解决方案是完全删除crs.

对这个问题的解释

对于你手头的问题,你没有按照预期的方式使用shadow_mark.如果调试ShadowMark(debug(get("train", ShadowMark)))的train函数,您将看到传递给shadow_mark的任何内容都将在当前动画步骤中显示的数据切片的上下文中求值.

我没有深入到gganimate的内部,但显然他们 for each 切片分割原始数据,并发挥他们的魔力.

重要的一点是,在某个步骤中,"当前"数据只是整个数据集(丰富了美学数据)的子集,也就是说,它只包含subset个原始行.

在这种情况下,计算ifelse(rb.zero$TOTAL == 0, 0, 0.25))没有意义,因为它总是计算长度为nrow(rb.zero.df)(=13)的向量,这可能会导致您看到的错误,特别是当当前数据片只有12行长(而ifelse(rb.zero$TOTAL == 0, 0, 0.25)always个13个元素长)时.


N.B.意思是,对于某些组合,您不会因为R's条回收规则而立即看到错误,只有当长度不兼容(通常不是彼此的倍数)时才会抛出错误.顺便说一句,这可能解释了为什么您看不到某些组合的错误,因为它碰巧总是导致相容的长度.


话虽如此,应该使用shadow_mark的方法是提供101的名称作为参数.这是可行的,因为shadow_mark使用Quosures,即它稍后在正确的上下文中判断其参数.上下文是前面提到的数据切片,其中在美学丰富的数据切片中有alpha个槽(正如您定义的美学).

长话短说,你应该这样设计你的情节:

## drop crs b/c of unfixed bug
rb.zero <- st_as_sf(rb.zero.df, coords = c("LONG", "LAT")) 

rb.zero.map <- ggplot() +
  geom_sf(data = rb.zero, aes(size = TOTAL, alpha = ifelse(TOTAL == 0, 0, 1))) +
  scale_alpha(range = c(0,1)) +
  guides(alpha = "none") +
  transition_states(YEAR, transition_length = 0, state_length = 1) +
  ggtitle("{closest_state}") +
  ### use alpha, gganimate knows how to evaluate it properly
  shadow_mark(alpha = alpha / 4)
animate(rb.zero.map)

R相关问答推荐

如何创建构成多个独立列条目列表的收件箱框列?

寻找图片边缘

从嵌套列表中智能提取线性模型系数

过滤器数据.基于两列的帧行和R中的外部向量

用derrr在R中查找组间的重复项

r替换lme S4对象的字符串的一部分

基于多列将值链接到NA

将数据集中的值增加到当前包含的最大值

如何在ggplot中标记qqplot上的点?

具有重复元素的维恩图

函数可以跨多个列搜索多个字符串并创建二进制输出变量

我们如何在R中透视数据并在之后添加计算

创建列并对大型数据集中的特定条件进行成对比较的更高效程序

快速合并R内的值

按两个因素将观测值分组后计算单独的百分比

如何根据其他列中的两个条件来计算数据帧中的行之间的差异?

主题(Legend.key=Element_RECT(Fill=&Quot;White&Quot;))不起作用

需要一个函数来在第一行创建一个新变量,然后用新变量替换一个不同的变量(对于多行)

策略表单连接两个非常大的箭头数据集,而不会 destruct 内存使用

在使用ggplot2的情况下,如何在使用coord_trans函数的同时,根据未转换的坐标比来定位geom_瓷砖?