【问题标题】:gganimate won't render when combining geom_point and geom_sf组合 geom_point 和 geom_sf 时 gganimate 不会渲染
【发布时间】:2019-04-15 10:45:29
【问题描述】:

我正在尝试为在 gganimate 中的地图上移动的点设置动画。在下面的示例中,仅对点进行动画处理,点和地图的静态图也可以,但将它们组合起来失败并出现错误Error in mapply(FUN = f, ..., SIMPLIFY = FALSE) : zero-length inputs cannot be mixed with those of non-zero length

这是一个再现:

加载库

# 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)

【问题讨论】:

  • gganimate 不在 cran 上,否则是一个很棒的 MWE。您能否使用 devtools::install 代码添加评论?正如推测一样,transitions_components 的参数从何而来?看来您需要一个具有时间序列中心点的 sf 对象。
  • @RichardCareaga 完全忘记 gganimate 不在 CRAN 上 - 感谢您的提醒!我认为 transition_components 的参数类似于 aes 的参数,即不带引号的列名。在 transition_components 中,它们分别是分组变量和时间步长变量。但我不希望 geom_sf 动画。我只是想要它在后台。不知道如何表明它应该是一个静态层。

标签: r ggplot2 sf gganimate


【解决方案1】:

  1. data = daes()ggplot() 移动到geom_point()
  2. transition_components() 更改为transition_time()
  3. shadow_trail 更改为shadow_wake
  4. (添加颜色)

代码

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)

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我不确定你的意思。 trackidd 中定义。前 100 行为 1,后 100 行为 2。它在area 中未定义,但time 也是如此。
    • 添加了一个答案,b/c 这是我发现做代码块的唯一方法。运行示例时, time 会在命名空间中结束,因为它是全局定义的,但 trackid 没有;它对 dtrack1track2 对象是本地的。您确实在 p2 的初始 ggplot() 中调用了 d,但是对于 geom_sf,您使用区域作为数据。 d 是一个小标题,如果你想引用它的组件,你要么必须明确地这样做,如 d$trackid 或通过 %>% 当你可以使用裸名时。
    • 我不认为这是正确的。 transition_components 采用不带引号的列名,就像 ggplot 中的 aes 一样。此外,如果是 trackid 未定义的问题,那么第一个动画情节将无法正常工作,但这样做: p
    • d 在第一个动画中有效,因为它设置了数据并且 + 参数不会更改它,因此无需引用“跟踪”。 “时间”已经是全球性的了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 2019-06-03
    • 2019-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多