cốt truyện gganimate nơi điểm ở lại và dòng mờ dần


11

Dưới đây là một ví dụ có thể tái tạo của một âm mưu tĩnh mà tôi muốn tạo hiệu ứng (tôi muốn chỉ ra cách thức lấy mẫu MCMC hoạt động).

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()

nhập mô tả hình ảnh ở đây

Những gì tôi muốn thấy là các điểm có thể nhìn thấy khi chúng được vẽ và hơi mờ (tức là alpha đi từ ví dụ 1 đến 0,3) sau đó, trong khi đó sẽ có một dòng chỉ hiển thị lịch sử gần đây (và lý tưởng mờ dần hiển thị lịch sử gần đây nhất ít phai nhất và hơn một vài bước trở lại hoàn toàn biến mất).

Những điều sau đây đạt được ít nhiều những gì tôi muốn cho điểm của mình (vì vậy theo một nghĩa nào đó, tôi chỉ muốn thêm các đường mờ dần vào điểm này kết nối một vài điểm cuối cùng - các điểm mờ dần chậm hơn trên một số khung hình thậm chí còn đẹp hơn):

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

Cốt truyện cho thấy các điểm nên mờ dần như thế nào

Điều tôi đang vật lộn là làm thế nào để thêm hai hành vi khác nhau cho hai địa chất, ví dụ như điểm và đường thẳng. Ví dụ, bên dưới các điểm biến mất (tôi không muốn chúng) và các dòng không mờ dần (tôi muốn chúng).

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) 

Câu trả lời:


17

Tôi gặp sự cố khi sử dụng các shadow_*chức năng tích hợp để kiểm soát nhiều hành vi cùng một lúc; nó dường như chỉ áp dụng một trong những gần đây nhất. (Sử dụng gganimate 1.0.3.9000)

Một cách để khắc phục điều này là tính toán các chuyển đổi bằng tay. Chẳng hạn, chúng tôi có thể sao chép dữ liệu 100 lần, một bản sao cho mỗi khung và sau đó chỉ định alpha cho lớp điểm của chúng tôi và alpha cho lớp phân đoạn của chúng tôi một cách riêng biệt.

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)

nhập mô tả hình ảnh ở đây

(Đối với kết xuất này, tôi gói nó vào animate( [everything above], width = 600, height = 400, type = "cairo"))


1
Cảm ơn rât nhiều. Một vấn đề nhỏ trong câu trả lời của bạn: point_alpha = ... & Seg_alpha = ... cần phải ở bên trong mutate (...). Sửa đổi câu trả lời cho phù hợp.
Bjorn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.