[r] 점이 유지되고 선이 사라지는 gganimate 플롯

다음은 애니메이션 플롯을 재현 할 수있는 재현 가능한 예입니다 (MCMC 샘플러의 작동 방식을 보여 드리고자 함).

library(tidyverse)
library(gganimate)

set.seed(1234)
plot_data <- tibble(x=cumsum(rnorm(100)),
                    y=cumsum(rnorm(100)),
                    time=1:length(x))

ggplot(data=plot_data,
       aes(x=y, y=x)) +
  geom_point() + geom_line()

여기에 이미지 설명을 입력하십시오

내가보고 싶은 것은 점이 그려지고 나중에 조금 희미 해지면서 (즉, 알파가 1에서 0.3으로 간다) 점이 표시되는 반면 최근의 역사 만 보여주는 선이 있다는 것입니다. 가장 최근의 역사는 가장 희미 해졌으며 몇 단계 뒤로 완전히 사라졌습니다.)

다음은 내 포인트에 대해 원하는 것을 어느 정도 달성합니다 (따라서 마지막 몇 포인트를 연결하는 페이딩 라인을 추가하고 싶습니다-일부 프레임에서 더 천천히 페이딩되는 포인트가 더 좋을 것입니다).

ggplot(data=plot_data,
       aes(x=y, y=x)) +
  geom_point() +
  transition_time(time) +
  shadow_mark(past = T, future=F, alpha=0.3)

포인트가 어떻게 페이드되어야하는지 보여주는 플롯

내가 어려움을 겪고있는 것은 점과 선과 같은 두 개의 기하학에 대해 두 가지 행동을 추가하는 방법입니다. 예를 들어 아래에서 점이 사라지고 (나는 원하지 않습니다) 선이 사라지지 않습니다 (나는 원합니다).

p <- ggplot(data=plot_data,
       aes(x=y, y=x)) +
  geom_point() +
  transition_time(time) +
  shadow_mark(past = T, future=F, alpha=0.3)

p + geom_line() +
  transition_reveal(along = time) +
  shadow_mark(past = T, future=F, alpha=0.3) 



답변

내장 shadow_*함수를 사용하여 한 번에 여러 동작을 제어 하는 데 문제가있었습니다 . 가장 최근의 것을 적용하는 것 같았습니다. (gganimate 1.0.3.9000 사용)

이 문제를 해결하는 한 가지 방법은 전환을 수동으로 계산하는 것입니다. 예를 들어, 데이터를 100 번 복사하고 각 프레임마다 한 번씩 복사 한 다음 점 레이어의 알파와 세그먼트 레이어의 알파를 별도로 지정할 수 있습니다.

plot_data %>%
  uncount(100, .id = "frame") %>%
  filter(time <= frame) %>%
  arrange(frame, time) %>%
  group_by(frame) %>%
  mutate(x_lag = lag(x),
         y_lag = lag(y),
         tail = last(time) - time,
         # Make the points solid for 1 frame then alpha 0.3
         point_alpha = if_else(tail == 0, 1, 0.3),
         # Make the lines fade out over 20 frames
         segment_alpha = pmax(0, (20-tail)/20)) %>%
  ungroup() %>%

  ggplot(aes(x=y, y=x, xend = y_lag, yend = x_lag, group = time)) +
  geom_segment(aes(alpha = segment_alpha)) +
  geom_point(aes(alpha = point_alpha)) +
  scale_alpha(range = c(0,1)) +
  guides(alpha = F) +
  transition_manual(frame)

여기에 이미지 설명을 입력하십시오

(이 렌더링을 위해 래핑했습니다 animate( [everything above], width = 600, height = 400, type = "cairo"))


답변