gganimate et carte choroplèthe

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Bertrand Vassor
Messages : 46
Enregistré le : 18 Sep 2017, 10:18

gganimate et carte choroplèthe

Messagepar Bertrand Vassor » 28 Avr 2020, 11:59

Bonjour,

je cherche à animer une carte choroplèthe. Suivant l'exemple donné ici https://ditheringdata.netlify.app/2018/01/01/gganimate/ avec un code adapté pour prendre en compte la dernière version de gganimate, je suis obligé d'arrêter mon traitement car la RAM (8 Go) et swap (7 Go)sont saturés.

Est-ce normal et dans ce cas je dois travailler sur un autre PC ou est-ce une erreur de code ? Quelles solutions pourraient fonctionner ?

Ci-dessous le code R mis en oeuvre :

Code : Tout sélectionner

library(tidyverse)
library(maptools)
library(mapproj)
library(gganimate)
library(transformr)
library(choroplethr)
data("df_president_ts")
us <- map_data("state")

elections <- df_president_ts %>%
  #gather into long data
  gather(year, winner, `1789`:`2012`) %>%
  #filter only elections after 1900
  filter(year >= 1900) %>%
  #join with state polygons
  right_join(us, by = "region") %>%
  mutate(party = case_when(
    winner %in% c("SR", "I", "AI", "PR") ~ "Third Party",
    winner == "D" ~ "Democrat",
    winner == "R" ~ "Republican"
  )) %>%  transform(year=as.integer(year)) %>%  filter(!is.na(party))

p1 <- ggplot(data = elections) +
  # polygons
  geom_polygon(aes(x = long, y = lat, group = group, fill = party),
               color = "#f5f5f2") +
  coord_map("albers", lat0=30, lat1=40) +
  scale_fill_manual(values = c("#05204A", "#A24936", "#3E5641"),
                    na.value = "gray70",
                    name = "Winning Party") +
  ggtitle("US Presidential Election Results: ")+transition_reveal(year)
p1


Je suis preneur de toutes les idées et vous en remercie par avance.
BVA

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: gganimate et carte choroplèthe

Messagepar Mickael Canouil » 28 Avr 2020, 13:00

Bonjour,

Personnellement je ne génère jamais les animations directement dans R pour des raisons évidentes, en particulier quand le nombre d'élément à animer et la durée de l'animation (ou le nombre d'image par seconde est élevée).
Ici, vous utilisez tous les paramètres par défaut qui ne sont clairement pas optimisées pour toutes les animations.

Code : Tout sélectionner

animate(
  plot = p + transition_reveal(year),
  width = 16,
  height = 9,
  units = "cm",
  res = 120,
  renderer = gifski_renderer(file = "my.gif")
)

EDIT :

Code : Tout sélectionner

library(choroplethr)
library(ggplot2)
library(tidyr)
library(dplyr)
library(gganimate)
library(forcats)
data("df_president_ts")

Code : Tout sélectionner

elections <- df_president_ts %>%
  select(region, matches("^19|^20")) %>% 
  pivot_longer
(cols = matches("^19|^20"), names_to = "year", values_to = "winner") %>%
  mutate(
    party = case_when(
      winner %in% c("SR", "I", "AI", "PR") ~ "Third Party",
      winner == "D" ~ "Democrat",
      winner == "R" ~ "Republican"
    ),
    year = as.integer(year),
    region = as.character(region)
  ) %>% 
  right_join
(map_data("state"), by = "region")

Code : Tout sélectionner

p1 <- ggplot(data = elections) +
  theme_void() +
  geom_polygon(aes(= long, y = lat, group = group, fill = fct_explicit_na(party)), colour = "#f5f5f2") +
  coord_map("albers", lat0 = 30, lat1 = 40) +
  scale_fill_manual(
    values = c("#05204A", "#A24936", "#3E5641", "gray70"),
    name = "Winning Party"
  ) +
  labs(title = "US Presidential Election Results: {closest_state}") +
  theme(
    plot.title.position = "plot", 
    plot
.title = element_text(hjust = 0.5),
    legend.margin = margin(0.5, 0.5, 0.5, 0.5, "cm")
  )

Code : Tout sélectionner

animate(
  plot = p1 + 
    transition_states
(year, transition_length = 3, state_length = 1) + 
    enter_fade
() + 
    exit_fade
(),
  width = 16,
  height = 12,
  units = "cm",
  res = 120,
  renderer = gifski_renderer(file = "my.gif")
)

Personnellement, je n'utiliserai pas transition_reveal() avec autant de polygones non réguliers (et parceque en théorie c'est avec l'aesthetic "x"), mais un simple transition_states() en jouant sur les paramètres pour avoir une transition fluide.
Image
PS: elles servent à quoi toutes les librairies que vous chargez ?

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Bertrand Vassor
Messages : 46
Enregistré le : 18 Sep 2017, 10:18

Re: gganimate et carte choroplèthe

Messagepar Bertrand Vassor » 28 Avr 2020, 14:56

Bonjour Mickaël,

merci pour les conseils. Je teste cela demain.
1)
Personnellement je ne génère jamais les animations directement dans R
comment procédez vous alors ? Je decouvre les possibilité de gganimate.
2) les librairies : en fait elles servent aussi à la préparation des données dans d'autres contextes, j'ai fait un bête copier coller étant en phase de test.

Encore merci.
BVA

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: gganimate et carte choroplèthe

Messagepar Mickael Canouil » 28 Avr 2020, 15:23

Je voulais dire de façon interactive comme pour un graphique classique.
Je le sauvegarde en dur dans un fichier gif.
Mickaël
mickael.canouil.fr | rlille.fr

Bertrand Vassor
Messages : 46
Enregistré le : 18 Sep 2017, 10:18

Re: gganimate et carte choroplèthe

Messagepar Bertrand Vassor » 28 Avr 2020, 15:36

Merci bien pour les réponses.
Je viens de tester et tout fonctionne parfaitement.
Bonne fin de journée.
BVA


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité