Исправить размытый / перекрывающийся текст при использовании gganimate - PullRequest
0 голосов
/ 31 октября 2018

У меня проблемы с созданием файлов высокого разрешения при использовании gganimate. Текст на графиках получается размытым, как будто текст пишется для каждого нового кадра в .gif.

Example of blurry chart text

Есть ли простое решение этой проблемы? Я попытался поиграться с 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"))

1 Ответ

0 голосов
/ 31 октября 2018

Кому annotate (или geom_text в моем коде) вы отправляете несколько одинаковых avg.value значений. Когда для каждого года вам нужен только один, вы добавляете сто значений. Это приводит к сотне «средних», нанесенных друг на друга.
Решение состоит в том, чтобы отправить различные данные в 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"))
...