gganimate::transition_time的结果是飞行的多边形。

试图创建一个具有简单特征的动画,本质上是一个空间变量的时间序列,其形式为horopleth地图。

问题是,在动画时,多边形在图上飞来飞去。

这里有一个可复制的例子,部分摘自于 https:/www.blog.cultureofinsight.com201709animated-choropleth-maps-in-r (它使用的是旧版的 gganimate.

加载包。

library(tidyverse) # dev ggplot version required: devtools::install_github("hadley/ggplot2")
library(sf)
library(readxl)
library(httr)
library(gganimate)

获取和组织数据,以实现可重复的例子。

# download the natural earth shapefile we need into your working directory
URL <- "http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_map_units.zip"
temp <- tempfile()
download.file(URL, temp)
unzip(temp)
unlink(temp)

# read in shapefile as an sf object and set the projection
# this will be our base world map for plot sans Antarctica
world <- st_read("ne_110m_admin_0_map_units.shp") %>% 
  st_transform(crs = "+proj=longlat +datum=WGS84") %>% 
  filter(!NAME %in% c("Fr. S. Antarctic Lands", "Antarctica"))

# download dataset into your working directory
url <- "https://www.blog.cultureofinsight.com/data/wc.xlsx"
GET(url, write_disk("wc.xlsx", overwrite=TRUE))

# read in our the massive 20 rows of data and get the winner/runner-up variable in 1 column #tidyafdata
# setting factor for winner to show first in the legend
winners <- read_excel("wc.xlsx") %>% 
  gather(w_l, country, winner:runner_up) %>% 
  mutate(w_l = factor(w_l, levels = c("winner", "runner_up")))

# merge our world shape file with our main dataset
# this will add the polygon for the appropriate country to each row of our winners dataset
# and remove any countries that haven't won or come 2nd in the WC
wc_geo <- left_join(world, winners, by = c("NAME" = "country")) %>%
  st_as_sf() %>%
  drop_na(Year)

创建gganimate对象。

wc_map <- ggplot() +
  geom_sf(data = world, colour = "#ffffff20", fill = "#2d2d2d60", size = .5) +
  geom_sf(data = wc_geo, aes(fill = w_l)) +
  coord_sf(crs = st_crs(world), datum = NA) +
  scale_fill_manual(values = c("#D9A441", "#A8A8A8"), name = NULL, labels = c("Winner", "Runner-Up")) +
  theme(legend.position = c(0.9, 1.01), legend.direction = "horizontal", axis.text = element_blank(), 
        panel.grid.minor = element_blank(), panel.grid.major = element_blank()) +
  transition_time(Year)

Animate:

animate(wc_map)

这就是结果:

Flying countries

解决方案:

这是一个分组的问题。你需要明确你的分组。在这种情况下,创建一个交互的 Yearw_l

您可以使用软件包 rnaturalearth 以更方便地获取世界国家地图。

library(tidyverse) 
library(gganimate)

world <- rnaturalearth::ne_countries( returnclass = 'sf') %>% filter(admin!= 'Antarctica')

url <- "https://www.blog.cultureofinsight.com/data/wc.xlsx"
httr::GET(url, httr::write_disk("wc.xlsx", overwrite=TRUE))

winners <- readxl::read_excel("wc.xlsx") %>% 
  gather(w_l, country, winner:runner_up) %>% 
  mutate(w_l = factor(w_l, levels = c("winner", "runner_up")))

wc_geo <- left_join(world, winners, by = c("admin" = "country")) %>%
  drop_na(Year)

p <- 
  ggplot() +
  geom_sf(data = world, colour = "#ffffff20", fill = "#2d2d2d60", size = .5) +
  geom_sf(data = wc_geo, aes(fill = w_l, group = interaction(w_l, Year))) +
  scale_fill_manual(values = c("#D9A441", "#A8A8A8"), name = NULL, labels = c("Winner", "Runner-Up")) +
  theme(legend.position = c(0.9, 1.01), legend.direction = "horizontal", axis.text = element_blank(), 
        panel.grid.minor = element_blank(), panel.grid.major = element_blank())

anim <- p + transition_time(Year)

animate(anim)

创建于2020-04-24,由 重读包 (v0.3.0)

P.S. 总是相同的国家,不是吗… …

给TA打赏
共{{data.count}}人
人已打赏
未分类

为什么改变我的变量值不影响我的列表?

2022-9-8 21:05:21

未分类

Angular BehaviorSubject没有从http调用中获取数据。

2022-9-8 21:05:23

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索