다음은 애니메이션 플롯을 재현 할 수있는 재현 가능한 예입니다 (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")
)