gganimate创建重复的图例和标题

时间:2017-03-22 14:37:37

标签: r ggplot2 gif animated-gif gganimate

我使用gif创建了动画图。gganimate。问题是输出有重复的图例和标题,我不知道导致它的原因。

图例应位于底部,标题应位于图表的左下角。关于我在这里做错了什么的想法?

可重复的例子:

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

更新[24-03-2017]:gganimate的作者David Robinson在Twitter向我确认这种奇怪的行为是由一个应该很快修复的错误引起的。

与此同时,@ hrbrmstr的解决方案似乎是一个很好的解决方案。另一种方法是使用较早版本的gganimate,可以像这样安装:

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

2 个答案:

答案 0 :(得分:3)

这是在gganimate之外执行此操作的方法。

清理文件是留给读者的一个练习: - )

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

答案 1 :(得分:2)

<body> <div class="beholder"> <div class="beholder_lille"> <div class="box"></div> <div class="appear"></div> </div> <div class="beholder_lille"> <div class="box"></div> <div class="appear"></div> </div> <div class="beholder_lille"> <div class="box"></div> <div class="appear"></div> </div> <div class="beholder_lille"> <div class="box"></div> <div class="appear"></div> </div> </div> <div class="beholder"> <div class="beholder_lille"> <div class="box"></div> <div class="appear"></div> </div> <div class="beholder_lille"> <div class="box"></div> <div class="appear"></div> </div> <div class="beholder_lille"> <div class="box"></div> <div class="appear"></div> </div> <div class="beholder_lille"> <div class="box"></div> <div class="appear"></div> </div> </div> </body> 存在一些问题。在文档中,在“详细信息”下,它指出:

  

如果保存到GIF,请使用利用冗余背景(比例,静态图层等)的自定义方法。

除了显示两组轴的gif之外,第一张图像除了水平轴外都是空白的。

如果你打电话

.beholder {
width: 50%;
display:table;
margin: 0 auto;
}

.beholder_lille {
background-color: green;
float: left;
margin:0 4%;
margin-bottom: 30%;
}


.box , .appear{
 background: blue;
 height: 100px;
 width: 100px; 
 float:left;
}


.appear{
background:red;
float: left;
display: none;
clear: both;
height: 600px;
width: 600px;
}
.box:hover{
 background: #e6e6e6;

}

 .box:hover + .appear {
 display:block;  
}

然后生成的电影就像预期的那样。

然后你可以在mp4上调用imagemagick转换为gif,在bash中(或适应来自R的系统调用):

gganimate_save

来自R:

gganimate(t, "output_test.mp4")