2017-03-22 4 views
1

J'ai créé une intrigue animée. gif en utilisant gganimate. Le problème est que la sortie a dupliqué la légende et la légende et je ne sais pas quelle est la cause.gganimate créant une légende et une légende en double

La légende devrait être en bas et la légende devrait être sur la partie inférieure gauche de l'intrigue. Des idées sur ce que je fais mal ici?

exemple Reproductible:

library(gapminder) 
library(ggplot2) 
library(gganimate) 
library(viridis) 

t <- ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop, color = continent, frame = year)) + 
     geom_point() + 
     scale_color_viridis(name="Continent", discrete=TRUE) + 
     scale_x_log10() + 
     theme_void() + 
     theme(legend.position = "bottom", legend.box = "vertical", legend.title.align = 0) + 
     labs(title = "Year: ") + 
     labs(caption = " Caption test") + 
     theme(plot.title = element_text(hjust = 0.5, vjust = 0.05)) + 
     theme(plot.caption = element_text(hjust = 0, color="gray40", size=10)) 



gganimate(t, "output_test.gif") 

enter image description here

UPDATE [24-03-2017]: David Robinson, l'auteur de gganimate me confirmé Twitter que ce comportement étrange est causé par un bug devrait être réparé bientôt.

En attendant, la solution de @ hrbrmstr semble être un bon travail. Une autre alternative est d'utiliser une ancienne version de gganimate, qui peut être installé comme ceci:

library(devtools) 
    install_github("dgrtwo/gganimate", ref = "26ec501") 
+1

Vous devez également 'bibliothèque (viridis)' dans votre exemple reproductible. – ds440

+0

C'est une bizarrerie du processus d'exportation gif: ça marche bien pour mp4 – ds440

Répondre

3

est ici un moyen pour le faire en dehors de gganimate.

Nettoyage des fichiers est un exercice laissé au lecteur :-)

library(gapminder) 
library(viridis) 
library(magick) 
library(tidyverse) 

td <- tempdir() 

years <- sort(unique(gapminder$year)) 

pb <- progress_estimated(length(years)) 

map_chr(years, ~{ 

    pb$tick()$print() 

    filter(gapminder, year == .x) %>% 
    ggplot(aes(gdpPercap, lifeExp, size = pop, color = continent)) + 
    geom_point() + 
    scale_color_viridis(name="Continent", discrete=TRUE) + 
    scale_x_log10() + 
    labs(title = sprintf("Year: %s", .x)) + 
    labs(caption = " Caption test") + 
    guides(colour = guide_legend(order = 2), shape = guide_legend(order = 1)) + 
    theme_void() + 
    theme(legend.position = "bottom", legend.box = "vertical", legend.title.align = 0) + 
    theme(plot.title = element_text(hjust = 0.5, vjust = 0.05)) + 
    theme(plot.caption = element_text(hjust = 0, color="gray40", size=10)) -> gg 

    fil <- file.path(td, sprintf("%04d.png", as.integer(.x))) 

    ggsave(fil, width=5, height=3, gg) 

    fil 

}) %>% 
    map(image_read) %>% 
    image_join() %>% 
    image_animate(fps=2, loop=1) %>% 
    image_write("animated.gif") 

enter image description here

+0

belle alternative. Merci! –

+0

Un problème mineur avec cette sortie est que la légende n'est pas identique sur toutes les images - gganimate garantit que la légende reste cohérente - bien qu'avec un peu de travail qui peut probablement être résolu avec des échelles manuelles. – ds440

+0

Oui. mais vous ne devriez pas compter sur 'gganimate' pour cet OMI.vous devriez préciser ce dont vous avez besoin. c'est un préfet personnel. – hrbrmstr

2

Il y a un certain problème avec gganimate_save. Dans la documentation, sous Détails, il est indiqué:

Si vous enregistrez au format GIF, utilisez une méthode personnalisée qui tire parti des arrière-plans redondants (échelles, couches statiques, etc.).

En plus du gif montrant les deux ensembles d'axes, la première image est vide à l'exception des axes horizontaux.

Si vous appelez au lieu

gganimate(t, "output_test.mp4") 

Ensuite, le film résultant est comme prévu.

Vous pouvez ensuite appeler ImageMagick sur le mp4 pour convertir en gif, en bash (ou adapter un appel système R):

> convert output_test.mp4 output_test.gif 

De R:

system('convert output_test.mp4 output_test.gif') 
+0

Merci. C'est une solution rapide et j'ai voté pour vous répondre, mais cela ne résout pas le problème pour enregistrer un fichier '.gif' –

+0

Il crée un gif, il crée tout d'abord un fichier mp4 temporaire. ImageMagick est une condition préalable pour gganimate de toute façon. – ds440