R gganimate-won';组合几何点和几何点时不渲染

R gganimate-won';组合几何点和几何点时不渲染,r,ggplot2,sf,gganimate,R,Ggplot2,Sf,Gganimate,我正在尝试在gganimate中为在地图上移动的点设置动画。在以下示例中,仅设置点的动画有效,点和贴图的静态绘图有效,但组合它们失败,mapply中出现错误错误(FUN=f,…,SIMPLIFY=FALSE):零长度输入不能与非零长度输入混合 这是一份报告: 加载库 创建数据 在背景中使用静态贴图设置点动画(失败) p2trackid未定义,是什么在p2中抛出错误;时间已定义。trackid未定义,是什么在p2中引发错误;时间已定义。 将data=d和aes()从ggplot()移动到geom_

我正在尝试在gganimate中为在地图上移动的点设置动画。在以下示例中,仅设置点的动画有效,点和贴图的静态绘图有效,但组合它们失败,mapply中出现错误
错误(FUN=f,…,SIMPLIFY=FALSE):零长度输入不能与非零长度输入混合

这是一份报告:

加载库 创建数据 在背景中使用静态贴图设置点动画(失败)
p2trackid未定义,是什么在p2中抛出错误;时间已定义。

trackid未定义,是什么在p2中引发错误;时间已定义。

  • data=d
    aes()
    ggplot()
    移动到
    geom_point()
  • transition\u components()
    更改为
    transition\u time()
  • shadow\u trail
    更改为
    shadow\u wake
  • (添加颜色)
  • 代码
    p2

  • data=d
    aes()
    ggplot()
    移动到
    geom_point()
  • transition\u components()
    更改为
    transition\u time()
  • shadow\u trail
    更改为
    shadow\u wake
  • (添加颜色)
  • 代码
    p2 gganimate不在cran上,否则是一个伟大的MWE。您能用devtools::install代码添加注释吗?正如推测一样,转换组件的参数从何而来?似乎您需要一个带有时间序列中心点的sf对象。@RichardCareaga完全忘记了gganimate不在CRAN上-谢谢提醒!我认为transition_组件的参数类似于aes的参数,即不带引号的列名。在transition_组件中,它们分别是分组变量和timestep变量。但我不想让geom_sf动画化。我只想把它放在背景里。不确定如何指示它应该是静态层。gganimate不在cran上,否则是一个很棒的MWE。您能用devtools::install代码添加注释吗?正如推测一样,转换组件的参数从何而来?似乎您需要一个带有时间序列中心点的sf对象。@RichardCareaga完全忘记了gganimate不在CRAN上-谢谢提醒!我认为transition_组件的参数类似于aes的参数,即不带引号的列名。在transition_组件中,它们分别是分组变量和timestep变量。但我不想让geom_sf动画化。我只想把它放在背景里。我不知道如何表明它应该是一个静态层。我不知道你的意思
    trackid
    d
    中定义。前100行为1,后100行为2。它在
    区域
    中未定义,但时间也未定义。添加了一个答案,b/c这是我发现的唯一执行代码块的方法。运行示例时,时间会在名称空间中结束,因为它是全局定义的,而trackid不是;它是d、track1和track2对象的本地对象。在p2的初始ggplot()中确实调用了d,但对于geom_sf,则使用area作为数据。d是一个TIBLE,如果你想引用它的组件,你要么显式地这样做,比如在d$trackid中,要么通过%>%当你可以使用裸名称时。我认为这是不对的
    transition\u组件
    采用不带引号的列名,就像
    ggplot
    中的
    aes
    一样。另外,如果是
    trackid
    未定义的问题,那么第一个动画情节将不起作用,但这确实起作用:第一个动画中的pd起作用,因为它设置数据,+参数不会改变它,所以不需要引用“tracked”。“Time”已经是全局的。我不确定你的意思
    trackid
    d
    中定义。前100行为1,后100行为2。它在
    区域
    中未定义,但时间也未定义。添加了一个答案,b/c这是我发现的唯一执行代码块的方法。运行示例时,时间会在名称空间中结束,因为它是全局定义的,而trackid不是;它是d、track1和track2对象的本地对象。在p2的初始ggplot()中确实调用了d,但对于geom_sf,则使用area作为数据。d是一个TIBLE,如果你想引用它的组件,你要么显式地这样做,比如在d$trackid中,要么通过%>%当你可以使用裸名称时。我认为这是不对的
    transition\u组件
    采用不带引号的列名,就像
    ggplot
    中的
    aes
    一样。另外,如果是
    trackid
    未定义的问题,那么第一个动画情节将不起作用,但这确实起作用:第一个动画中的p d起作用,因为它设置了数据,+参数不会改变它,所以不需要引用“tracked”。“时间”已经是全局的。
    # gganimate isn't on CRAN
    devtools::install_github('thomasp85/gganimate')
    library(tidyverse)
    library(gganimate)
    library(sf)
    # for the spatial data
    library(rnaturalearth)             
    
    # Points data
    time <- seq(ISOdate(2015, 6, 1), ISOdate(2015, 8, 1), length.out = 100)
    track1 <- tibble(lon = seq(-161, -155, length.out = 100),
                     lat = seq(19, 25, length.out = 100),
                     time = time,
                     trackid = 1)
    track2 <- tibble(lon = seq(-155, -161, length.out = 100),
                     lat = seq(19, 25, length.out = 100),
                     time = time,
                     trackid = 2)
    d <- rbind(track1, track2)
    
    # Spatial data
    earth <- st_as_sf(ne_download(scale = "medium",
                                  category = "physical",
                                  type = "coastline"))
    deg_buff <- 1
    lon_range <- range(d$lon) + c(-deg_buff, deg_buff)
    lat_range <- range(d$lat) + c(-deg_buff, deg_buff)
    bbox <- st_polygon(list(cbind(lon_range[c(1,1,2,2,1)], 
                                  lat_range[c(1,2,2,1,1)])))
    bbox <- st_sfc(bbox)
    st_crs(bbox) <- st_crs(earth)
    area <- st_intersection(earth, bbox)
    
    p <- ggplot(d, aes(lon, lat)) +
      geom_point() +
      labs(subtitle = 'Date: {format(frame_time, "%b %e")}') +
      transition_components(trackid, time) +
      shadow_trail(distance = 0.01, size = 0.3)
    animate(p, 100, 20)
    
    ggplot(d, aes(lon, lat)) +
      geom_sf(data = area, inherit.aes = FALSE) +
      geom_point()
    
    p2 <- ggplot(d, aes(lon, lat)) +
      geom_sf(data = area, inherit.aes = FALSE) +
      geom_point() +
      labs(subtitle = 'Date: {format(frame_time, "%b %e")}') +
      transition_components(trackid, time) +
      shadow_trail(distance = 0.01, size = 0.3)
    animate(p2, 100, 20)
    
    p2 <- ggplot() +
        geom_sf(data = area, color = "red") +
        geom_point(data = d, aes(lon, lat), inherit.aes = FALSE) +
        labs(subtitle = 'Date: {format(frame_time, "%b %e")}') +
        transition_time(time) +
        shadow_wake(0.3)
    
    animate(p2, 100)