当使用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)