使用 gganimate 时修复 blurry/overlapping 文本
Fix blurry/overlapping text when using gganimate
我在使用 gganimate
时无法创建高分辨率文件。图表中的文本变得模糊,几乎就像是为 .gif
中的每个新帧编写文本一样。
这个问题有简单的解决方法吗?我尝试摆弄 ani.options()
,但也没有任何运气。
示例数据和代码:
value <- sample(0:30, 300, replace = TRUE)
year <- rep(c(2000, 2001, 2002), 100)
df <- as.data.frame(cbind(value, year))
library(gganimate)
library(tidyverse)
df <- df %>% group_by(year) %>% mutate(avg.value = mean(value))
p <- df %>%
ggplot(aes(x = value)) +
geom_histogram(position = 'identity', color = "white") +
geom_segment(aes(xend = avg.value, x = avg.value, y = 0, yend = -.5),
color = "red", size = 2.5) +
transition_states(as.factor(year), transition_length = 2, state_length
= 1, wrap = TRUE) +
annotate("text", x = df$avg.value, y = -1, label = "Average") +
labs(x = " ",
y = "",
title = "Example chart",
subtitle = "Don't it look blurry?")
animate(p, nframes = 100, renderer = gifski_renderer("example.gif"))
要向 annotate
(或我的代码中的 geom_text
)提交多个相同的 avg.value
值。当每年你只需要一个时,你就会添加一百个值。这导致一百 "Average" 相互绘制。
解决方案是向 geom_text
(即 df2
)提交不同的数据,这些数据仅包含 3 行(每年一个条目)。
代码:
library(gganimate)
library(tidyverse)
value <- sample(0:30, 300, replace = TRUE)
year <- rep(c(2000, 2001, 2002), 100)
df1 <- as.data.frame(cbind(value, year))
df1 <- df1 %>% group_by(year) %>% mutate(avg.value = mean(value))
df2 <- df1 %>% group_by(year) %>% summarize(avg.value = head(avg.value, 1))
r1 <- ggplot(df1) +
geom_histogram(aes(value), position = "identity", color = "white") +
geom_segment(aes(x = avg.value, xend = avg.value, y = 0, yend = -0.5),
color = "red", size = 2.5) +
geom_text(aes(avg.value, -1, label = "Average"), df2) +
transition_states(as.factor(year), 2, 1) +
labs(title = "Example chart",
subtitle = "No more blur",
x = NULL,
y = NULL)
animate(r1, nframes = 100, renderer = gifski_renderer("example.gif"))
我在使用 gganimate
时无法创建高分辨率文件。图表中的文本变得模糊,几乎就像是为 .gif
中的每个新帧编写文本一样。
这个问题有简单的解决方法吗?我尝试摆弄 ani.options()
,但也没有任何运气。
示例数据和代码:
value <- sample(0:30, 300, replace = TRUE)
year <- rep(c(2000, 2001, 2002), 100)
df <- as.data.frame(cbind(value, year))
library(gganimate)
library(tidyverse)
df <- df %>% group_by(year) %>% mutate(avg.value = mean(value))
p <- df %>%
ggplot(aes(x = value)) +
geom_histogram(position = 'identity', color = "white") +
geom_segment(aes(xend = avg.value, x = avg.value, y = 0, yend = -.5),
color = "red", size = 2.5) +
transition_states(as.factor(year), transition_length = 2, state_length
= 1, wrap = TRUE) +
annotate("text", x = df$avg.value, y = -1, label = "Average") +
labs(x = " ",
y = "",
title = "Example chart",
subtitle = "Don't it look blurry?")
animate(p, nframes = 100, renderer = gifski_renderer("example.gif"))
要向 annotate
(或我的代码中的 geom_text
)提交多个相同的 avg.value
值。当每年你只需要一个时,你就会添加一百个值。这导致一百 "Average" 相互绘制。
解决方案是向 geom_text
(即 df2
)提交不同的数据,这些数据仅包含 3 行(每年一个条目)。
代码:
library(gganimate)
library(tidyverse)
value <- sample(0:30, 300, replace = TRUE)
year <- rep(c(2000, 2001, 2002), 100)
df1 <- as.data.frame(cbind(value, year))
df1 <- df1 %>% group_by(year) %>% mutate(avg.value = mean(value))
df2 <- df1 %>% group_by(year) %>% summarize(avg.value = head(avg.value, 1))
r1 <- ggplot(df1) +
geom_histogram(aes(value), position = "identity", color = "white") +
geom_segment(aes(x = avg.value, xend = avg.value, y = 0, yend = -0.5),
color = "red", size = 2.5) +
geom_text(aes(avg.value, -1, label = "Average"), df2) +
transition_states(as.factor(year), 2, 1) +
labs(title = "Example chart",
subtitle = "No more blur",
x = NULL,
y = NULL)
animate(r1, nframes = 100, renderer = gifski_renderer("example.gif"))