当使用coord_sf指定xlim、ylim时,geom_sf填充失败。在尝试使用av软件包创建动画时寻找解决方法

当使用coord_sf指定xlim、ylim时,geom_sf填充失败。在尝试使用av软件包创建动画时寻找解决方法,r,ggplot2,video,sf,gganimate,R,Ggplot2,Video,Sf,Gganimate,ggplot2存在一个已知问题,即当使用coord\u sf指定xlim和ylim时,geom\u sf功能并不总是起作用。这个问题似乎是Windows特有的,目前的解决方法是将绘图保存为.png 我遇到的问题是,我没有尝试制作静态绘图,而是使用av包将数百个绘图缝合在一起的动画 基本上,我正在寻找帮助实现一个合适的变通方法,一个不需要保存或调用单个.png文件的方法 如有任何意见或建议,将不胜感激 下图显示了我解决这个问题的动机,绘制了飓风的时间轨迹图 Stackoverflow不允许发布视频

ggplot2
存在一个已知问题,即当使用
coord\u sf
指定
xlim
ylim
时,
geom\u sf
功能并不总是起作用。这个问题似乎是Windows特有的,目前的解决方法是将绘图保存为.png

我遇到的问题是,我没有尝试制作静态绘图,而是使用
av
包将数百个绘图缝合在一起的动画

基本上,我正在寻找帮助实现一个合适的变通方法,一个不需要保存或调用单个.png文件的方法

如有任何意见或建议,将不胜感激

下图显示了我解决这个问题的动机,绘制了飓风的时间轨迹图

Stackoverflow不允许发布视频,因此如果您想查看我的可复制代码的输出,您可以查看我的原始GitHub帖子,可以在这里找到

库(tidyverse)
图书馆(sf)
图书馆(影音)
拖拉机%
挑选(
几何学
第10条,
GEOID10
)
圣克鲁斯河(域)
种子集(264)

v1正如Thomas Lin Pedersen在您链接的github问题中所建议的,解决方案是在Windows机器上使用
png(…,type='cairo')
设备。如果您阅读
?av::av_capture_graphics()
,您将看到
..
参数可用于将参数传递给
png()
函数。因此,我建议这样做:

库(tidyverse)
图书馆(sf)
图书馆(影音)
拖拉机%
挑选(
几何学
第10条,
GEOID10
)
圣克鲁斯河(域)
种子集(264)

非常好,谢谢。另外,我想使用
gganimate
,但我一直很难让它在sf上迭代。我想我会提到,我能够解决不断变化的图例比例问题,定义比例的范围。类似于
+scale\u fill\u viridis\u c(“图例标题,限制=c(0,此处为最大值))
是,这似乎是合适的解决方案:)
library(tidyverse)
library(sf)
library(av)

tracts <- read_sf("https://opendata.arcgis.com/datasets/230f9d23f6874be983901876cd600c4e_0.geojson") %>% 
  select(
    geometry,
    ALAND10,
    GEOID10
    )
st_crs(tracts)

set.seed(264)

v1 <- runif(1:dim(tracts)[1], .7, 1.25)

tracts2 <- cbind(tracts, v1)

tracts_2017 <- tracts2 %>%
  mutate(season=2017)

tracts_2018 <- tracts2 %>%
  mutate(
    season=2018,
    ALAND10 = ALAND10*v1
    )
tracts3 <- rbind(tracts_2017, tracts_2018) 
  st_crs(tracts3)

makeplot1 <- function(){
  datalist1 <- split(
    tracts3,
    tracts3$season
  )
  datalist2 <- split(
    tracts3,
    tracts3$season
  )
  mapply(function(data1, data2){
    p1 <- ggplot() + 
      geom_sf(
        data = data1,
        aes(fill = ALAND10)
      ) +
      geom_sf(
        data = data2 %>% st_union(),
        fill = alpha("red", 0.4),
        color = alpha("red", 0.4)
      ) +
      coord_sf(
        ylim = c( 43.04, 43.07),
        xlim = c(-76.14,-76.10),
        clip = "on",
        expand = F
      )
    print(p1)
    
    },
    datalist1, datalist2
  ) 
}

makeplot2 <- function(){
  datalist1 <- split(
    tracts3,
    tracts3$season
  )
  datalist2 <- split(
    tracts3,
    tracts3$season
  )
  mapply(function(data1, data2){
    p2 <- ggplot() + 
      geom_sf(
        data = data1,
        aes(fill = ALAND10)
      ) +
      geom_sf(
        data = data2 %>% st_union(),
        fill = alpha("red", 0.4),
        color = alpha("red", 0.4)
      ) 
    print(p2)
    
  },
  datalist1, datalist2
  ) 
}

video_file1 <- file.path(tempdir(), 'Tracts1.mp4')
av::av_capture_graphics(makeplot1(), video_file1, vfilter='framerate=fps=10')
av::av_media_info(video_file1)
utils::browseURL(video_file1)

video_file2 <- file.path(tempdir(), 'Tracts2.mp4')
av::av_capture_graphics(makeplot2(), video_file2, vfilter='framerate=fps=10')
av::av_media_info(video_file2)
utils::browseURL(video_file2)