Как контролировать появление мигающих точек в gganimate - PullRequest
0 голосов
/ 23 октября 2019

Скажите, что у меня есть эти данные, которые я хочу анимировать с помощью ggplot2 + gganimate.

library(ggplot2)
library(gganimate)

data <- data.frame(day = c(1:5, 1:5), 
    x = c(rep(2,5), rep(4, 5)), 
    y=c(rep(1, 5), rep(2, 5)))

data <- data[c(1:2, 4:10),]

Цели анимации / вопроса:

Нет. 1. иметь мигающие красные точки для каждого дня + x + y точка, которая находится в наборе данных (это означает, что есть наблюдение за этим днем ​​+ x + y). Вспышка должна быть очень короткой. После того, как он начнет мигать, он должен перейти к цвету фона (контролируемому shadow_mark) черного цвета. Обратите внимание, что я не хочу, чтобы точки плавали вокруг, оставались только там, где они есть (см. Решение этого вопроса: Как сделать так, чтобы точки в gganimate появлялись, а не переходили ).

Нет. 2. Я также хочу, чтобы точки начинали мигать именно тогда, когда начинается их день. Вот код, который выполняет только часть того, что я хочу, но не может (полностью) адресовать номера 1 и 2:

ggplot(data, aes(x,y, group=interaction(x,y))) +
    geom_point(color="red", size=3) +
    transition_time(day) +
    shadow_mark(color="black", size=3) +
    theme(plot.subtitle = element_text(hjust = 0.7)) +      
    labs(subtitle = paste('day: {frame_time}'))  -> a

anim_save("test.gif", a, end_pause=6, width = 400, height = 450, duration=15)

Вот результирующая анимация:

enter image description here

Здесь есть две проблемы, которые я надеюсь решить:

  1. Точки не только мгновенно мигают, но и слишком долго мигают. Другими словами, я хотел бы кратко увидеть красную точку, затем черную точку, затем красную точку и т. Д.
  2. Существует также проблема с началом вспышки. Это иллюстрируется, когда точка становится черной (потому что data отсутствует 3-й день для (x = 2, y = 1) точки), как и ожидалось. Однако в течение 3-го дня он частично становится черным, а в течение 4-го дня снова превращается в красный, но я бы хотел, чтобы он стал черным точно в день, когда начинается 3-й день, и мигал красным точно в день, когда начинается 4-й день. Обратите внимание, что я не уверен, вызвано ли это смещение времени поведением transition_time или поведением субтитров frame_time или чем-то еще.

Есть предложения?

1 Ответ

1 голос
/ 25 октября 2019

Вот подход, при котором данные подготавливаются так, чтобы дать 25 кадров на каждый день, когда цвет заставляется мигать только для первого из них:

library(dplyr); library(tidyr)
f_per_day <- 25
animate(
  data %>%
    uncount(f_per_day, .id = "frame") %>%
    mutate(time = day + (frame-1)/f_per_day) %>%

    ggplot(aes(x, y, color = frame == 1)) +
    geom_point(size = 3) +
    scale_color_manual(values = c("black", "red"), guide = F) +
    theme(plot.subtitle = element_text(hjust = 0.7)) +      
    labs(subtitle = paste('day: {floor(frame_time*10)/10}')) +
    transition_time(time),

  width = 400, 
  height = 450, 
  fps = 25, 
  type = "cairo")

enter image description here

...