ggsave 和 gganimate 的“动画”中符号的大小一致

Posted

技术标签:

【中文标题】ggsave 和 gganimate 的“动画”中符号的大小一致【英文标题】:Consistent size for symbols in ggsave and gganimate's 'animate' 【发布时间】:2020-03-10 12:35:12 【问题描述】:

我的最终目标是创建两个输出:

1) 显示我所有数据的静态图像,另存为 png 2) 我的数据动画,保存为gif

我正在使用ggplot2gganimate,我很困惑为什么两种保存方法之间的符号大小不一致。

我尝试调整dpi 并保存为jpg 而不是png,但没有运气。 谁能帮我弄清楚如何使两个输出对象中的宽度、高度和符号大小保持一致?

这是一个显示两个输出的可重现示例。可以看到gif中的黑点变小了。

制作png

library(gganimate)
library(ggplot2)

locs <- data.frame(x = c(1, 2, 3, 4, 5, 6),
                   y = c(1, 2, 3, 3.1, 3.2, 6),
                   LDT = c(1, 2, 3, 4, 5, 6))

g <- ggplot(locs, aes(x, y)) +
  geom_point() +
  theme_void() +
  theme(plot.background = element_rect(fill = "pink"))
g
ggsave("test.png", g, width = 2, height = 2, dpi = 100)

制作gif

anim <- g + transition_time(LDT)
animate(anim, duration = 1, fps = 20, width = 200, height = 200)
anim_save("test.gif")

【问题讨论】:

【参考方案1】:

animate() 默认使用png() 生成帧。

在您的 ggsave 电话中,您指定了 100 dpi 的绘图分辨率。

要使用png 获得相同的结果,您必须设置res = 100(请参阅test_png_device.png)。

因此,要使用animate 获得一致的符号大小,您必须将分辨率传递给png 作为animate 的可选参数,如下所示:

library(gganimate)
library(ggplot2)
library(gifski)

locs <- data.frame(x = c(1, 2, 3, 4, 5, 6),
                   y = c(1, 2, 3, 3.1, 3.2, 6),
                   LDT = c(1, 2, 3, 4, 5, 6))

g <- ggplot(locs, aes(x, y)) +
  geom_point() +
  theme_void() +
  theme(plot.background = element_rect(fill = "pink"))

ggsave("test.png", g, width = 2, height = 2, dpi = 100)

png(filename = "test_png_device.png", width = 200, height = 200, units = "px", res = 100)
g
dev.off()

anim <- g + transition_time(LDT)
myAnimation <- animate(anim, duration = 1, fps = 20, width = 200, height = 200, renderer = gifski_renderer(), res = 100)
anim_save("test.gif", animation = myAnimation)


补充:不确定您是否对此感兴趣,但是,我喜欢使用 library(plotly) 制作动画,因为它默认添加了动画滑块。

这是您示例的ggplotly-方式:

library(plotly)
library(htmlwidgets)

locs <- data.frame(x = c(1, 2, 3, 4, 5, 6),
                   y = c(1, 2, 3, 3.1, 3.2, 6),
                   LDT = c(1, 2, 3, 4, 5, 6))

g <- ggplot(locs, aes(x, y)) + theme_void() + 
  theme(panel.background = element_rect(fill = "pink")) +
  geom_point(aes(frame = LDT))

p <- ggplotly(g) %>% 
  animation_opts(500, easing = "linear", redraw = FALSE)

saveWidget(p, file = "myAnimation.html", selfcontained = TRUE)
browseURL("myAnimation.html")

Here可以找到相关帖子。

【讨论】:

我知道这很简单,但我就是搞不懂!感谢您花时间帮助我。 plotly 库也是很好的提示。我喜欢在 PowerPoint 演示文稿中嵌入动画,因此 .mp4 格式更适合我。只需要找出正确的编解码器,PowerPoint 就可以真正播放该死的东西! 很高兴能帮上忙!使用 H.264 视频编码的 Microsoft recommends .mp4 文件。祝你好运。干杯 完成!抱歉,我认为奖励赏金会自动执行 - 感谢您的推动!

以上是关于ggsave 和 gganimate 的“动画”中符号的大小一致的主要内容,如果未能解决你的问题,请参考以下文章

R语言gganimate包创建可视化gif动图:gganimate包创建动态线型图动画基于transition_time函数使用geom_point函数显示动画移动的数据点并保留线图中的全部数据点

R语言使用gganimate包和ggforce包可视化动画并动态缩放(zoom)移动动画的内容

R语言gganimate包创建可视化gif动图可视化动图:gganimate包创建动态线型图动画基于transition_time函数使用geom_point函数显示动画移动的数据点

R语言gganimate包创建可视化gif动图:ggplot2可视化静态条形图(bar plot)gganimate包创建动态条形图(bar plot)动画基于transition_time函数

R语言gganimate包创建可视化gif动图可视化动图:ggplot2可视化静态散点图(scatter plot)gganimate包创建动态散点图动画基于transition_time函数

R语言gganimate包创建可视化gif动图可视化动图:gganimate包创建动态散点图动画基于transition_time函数使用shadow_mark函数将数据集对应的静态图作为背景图