พล็อต gganimate ที่จุดพักและเส้นจางหาย


11

นี่คือตัวอย่างที่ทำซ้ำได้ของสแตติกพล็อตซึ่งฉันต้องการทำให้เคลื่อนไหว (ฉันต้องการแสดงให้เห็นว่าตัวเก็บตัวอย่าง 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()

ป้อนคำอธิบายรูปภาพที่นี่

สิ่งที่ฉันต้องการเห็นคือจุดที่มองเห็นได้เมื่อวาดและจางไปเล็กน้อย (เช่น alpha เริ่มจากเช่น 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)

พล็อตแสดงให้เห็นว่าคะแนนควรจางหายไปอย่างไร

สิ่งที่ฉันกำลังดิ้นรนคือจะเพิ่มพฤติกรรมที่แตกต่างกันสองอย่างสำหรับสอง geoms เช่นจุดและเส้น เช่นในจุดด้านล่างจุดหายไป (ฉันไม่ต้องการให้) และเส้นไม่จางหาย (ฉันต้องการให้พวกเขา)

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) 

คำตอบ:


17

ฉันมีปัญหาในการใช้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"))


1
ขอบคุณมาก. ปัญหาเล็กน้อยหนึ่งข้อในคำตอบของคุณ: point_alpha = ... & segment_alpha = ... ต้องอยู่ภายในการกลายพันธุ์ (... ) แก้ไขคำตอบตามนั้น
Björn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.