noktaların kaldığı ve çizginin kaybolduğu gganimate grafiği


11

Burada, hareketlendirmek istediğim statik bir grafiğin tekrarlanabilir bir örneğidir (MCMC örnekleyicinin nasıl davrandığını göstermek istiyorum).

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

resim açıklamasını buraya girin

Görmek istediğim, daha sonra çizilen ve biraz soluk olduğunda (yani alfa örneğin 1'den 0,3'e giderken) görünür olmaktır, ancak yalnızca yakın tarihi gösteren bir çizgi olacaktır (ve ideal olarak en yakın tarihin en az solmuş ve birkaç adımdan daha fazla geriye tamamen kaybolması).

Aşağıdakiler, puanlarım için istediğim az çok şey elde ediyor (bu yüzden bir anlamda sadece son birkaç noktayı birleştiren soluk çizgiler eklemek istiyorum - bazı karelerde daha yavaş solma noktaları daha da güzel olurdu):

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

Noktaların nasıl solması gerektiğini gösteren çizim

Ne ile mücadele ediyorum nokta ve çizgi gibi iki geom için iki farklı davranış eklemek için nasıl. Örneğin, aşağıdaki noktalar kaybolur (onları istemiyorum) ve çizgiler solmaz (onları istiyorum).

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) 

Yanıtlar:


17

shadow_*Bir seferde birden fazla davranışı kontrol etmek için yerleşik işlevleri kullanmada sorun yaşadım ; sadece en sonuncuyu uyguluyor gibiydi. (Gganimate 1.0.3.9000 kullanarak)

Bunu aşmanın bir yolu geçişleri manuel olarak hesaplamaktır. Örneğin, verileri her kare için bir kopya olmak üzere 100 kez kopyalayabilir ve ardından noktalar katmanımız için alfa ve segment katmanımız için alfa ayrı ayrı belirtebiliriz.

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)

resim açıklamasını buraya girin

(Bu render için sardım animate( [everything above], width = 600, height = 400, type = "cairo"))


1
Çok teşekkür ederim. Cevabınızdaki küçük bir sorun: point_alpha = ... & segment_alpha = ... mutasyonun içinde olmalı (...). Cevabı buna göre değiştirdi.
Björn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.