गगनभेदी भूखंड जहाँ बिंदु बने रहते हैं और लाइन फीकी पड़ जाती है


11

यहां एक स्थिर कथानक का एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण है, जिसे मैं चेतन करना चाहता हूं (मैं दिखाना चाहता हूं कि एमसीएमसी नमूनाकर्ता कैसे व्यवहार करता है)।

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) 

जवाबों:


17

मुझे बिल्ट-इन का उपयोग करने में परेशानी हुई shadow_* एक समय में एक से अधिक व्यवहार को नियंत्रित करने के कार्यों ; यह सिर्फ हाल ही में लागू करने के लिए लग रहा था। (गगनभेदी 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 = ... और खंड_alpha = ... को म्यूट के अंदर होना चाहिए (...)। तदनुसार उत्तर संशोधित किया।
ब्योर्न
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.