अवलोकन द्वारा हिस्टोग्राम अवलोकन का निर्माण करने के लिए गैगनिएट का उपयोग करें? बड़े डेटासेट के लिए काम करने की आवश्यकता (~ n = 5000)


10

मैं एक सामान्य वितरण से अंक का नमूना लेना चाहूंगा, और तब gganimateतक पैकेज का उपयोग करके एक डॉटप्लेट का निर्माण कर सकता हूं जब तक कि अंतिम फ्रेम पूर्ण डॉटप्लॉट नहीं दिखाता।

एक समाधान जो बड़े डेटासेट के लिए काम करता है ~ 5,000 - 20,000 अंक आवश्यक है।

यहाँ मेरे पास अब तक का कोड है:

library(gganimate)
library(tidyverse)

# Generate 100 normal data points, along an index for each sample 
samples <- rnorm(100)
index <- seq(1:length(samples))

# Put data into a data frame
df <- tibble(value=samples, index=index)

डीएफ इस तरह दिखता है:

> head(df)
# A tibble: 6 x 2
    value index
    <dbl> <int>
1  0.0818     1
2 -0.311      2
3 -0.966      3
4 -0.615      4
5  0.388      5
6 -1.66       6

स्थिर प्लॉट सही डॉटप्लॉट दिखाता है:

# Create static version
plot <- ggplot(data=df, mapping=aes(x=value))+
          geom_dotplot()

हालाँकि, gganimateसंस्करण नहीं है (नीचे देखें)। यह केवल एक्स-अक्ष पर डॉट्स डालता है और उन्हें स्टैक नहीं करता है।

plot+
  transition_reveal(along=index)

स्थैतिक साजिश

यहाँ छवि विवरण दर्ज करें

ऐसा ही कुछ आदर्श होगा: क्रेडिट: https://gist.github.com/thomasp85/88d6e7883883315314f341d2207122a1 यहाँ छवि विवरण दर्ज करें


Heya। क्या मैं बेहतर सुस्पष्टता के लिए एक अलग शीर्षक सुझा सकता हूं? मैं वास्तव में इस एनिमेटेड हिस्टोग्राम को पसंद करने लगा था, और मुझे लगता है कि यह एक महान दृश्य है ... "एनिमेटेड डॉट हिस्टोग्राम, अवलोकन द्वारा निर्मित अवलोकन" की तरह एसएचटी शायद अधिक प्रासंगिक होगा?
Tjebo

जवाबों:


9

एक अन्य विकल्प एक और जियोम के साथ अंक खींचना है। आपको पहले अपने डेटा (और बायनिंग) पर कुछ गणनाएँ करने की आवश्यकता होगी, लेकिन इसके लिए आपके डेटा को लंबे समय तक बनाने की आवश्यकता नहीं है।

उदाहरण के लिए, आप उपयोग कर सकते हैं geom_point, लेकिन चुनौती आपके बिंदुओं के आयामों को सही ढंग से प्राप्त करने की होगी, इसलिए वे स्पर्श करते हैं / स्पर्श नहीं करते हैं। यह व्यूपोर्ट / फाइल के आकार पर निर्भर करता है।

लेकिन आप भी सिर्फ ggforce::geom_ellipseअपने डॉट्स बनाने के लिए उपयोग कर सकते हैं :)

geom_point (व्यूपोर्ट आकार के साथ परीक्षण और त्रुटि)

library(tidyverse)
library(gganimate)

set.seed(42)
samples <- rnorm(100)
index <- seq(1:length(samples))
df <- tibble(value = samples, index = index)

bin_width <- 0.25

count_data <- # some minor data transformation
  df %>%
  mutate(x = plyr::round_any(value, bin_width)) %>%
  group_by(x) %>%
  mutate(y = seq_along(x))

plot <-
  ggplot(count_data, aes(group = index, x, y)) + # group by index is important
  geom_point(size = 5)

p_anim <- 
  plot +
  transition_reveal(index)

animate(p_anim, width = 550, height = 230, res = 96)

geom_ellipse (बिंदु आकार का पूर्ण नियंत्रण)

library(ggforce)
plot2 <- 
  ggplot(count_data) +
  geom_ellipse(aes(group = index, x0 = x, y0 = y, a = bin_width/2, b = 0.5, angle = 0), fill = 'black') +
  coord_equal(bin_width) # to make the dots look nice and round

p_anim2 <- 
  plot2 +
  transition_reveal(index) 

animate(p_anim2) 

उस लिंक में अपडेट करें जिसे आप थोमस के अद्भुत उदाहरण के लिए प्रदान करते हैं, आप देख सकते हैं कि वह एक समान दृष्टिकोण का उपयोग करता है - वह जियोम_लिपिप के बजाय जियोम_ सर्किल का उपयोग करता है, जिसे मैंने ऊर्ध्वाधर और क्षैतिज त्रिज्या दोनों के लिए बेहतर नियंत्रण के कारण चुना था।

"गिरने वाली बूँदें" प्रभाव प्राप्त करने के लिए, आपको transition_statesप्रति सेकंड एक लंबी अवधि और कई फ्रेम की आवश्यकता होगी ।

p_anim2 <- 
  plot2 +
  transition_states(states = index, transition_length = 100, state_length = 1) +
  shadow_mark() +
  enter_fly(y_loc = 12) 

animate(p_anim2, fps = 40, duration = 20) 

2020-04-29 को रेप्रेक्स पैकेज (v0.3.0) द्वारा बनाया गया

से कुछ प्रेरणा: ggplot डॉटप्लॉट: geom_dotplot का उचित उपयोग क्या है?


मैं वाई मूल्य के अनुसार पंक्तियों में एक-एक करके आने के लिए देख रहा हूं।
अधिकतम

2
@ मैक्स अपडेट देखें - बस y को इंडेक्स से बदलें।
ताजेबो

3

इसे इस्तेमाल करे। मूल विचार समूह को फ्रेम करने के लिए अवलोकन है, अर्थात सूचकांक द्वारा विभाजित किया गया है और फिर फ्रेम को नमूने जमा करते हैं, अर्थात फ्रेम 1 में केवल पहला अवलोकन दिखाया गया है, फ्रेम 2 अवलोकन 1 और 2 में, ..... शायद इसे प्राप्त करने का एक अधिक सुंदर तरीका है, लेकिन यह काम करता है:

library(ggplot2)
library(gganimate)
library(dplyr)
library(purrr)

set.seed(42)

# example data
samples <- rnorm(100)
index <- seq(1:length(samples))

# Put data into a data frame
df <- tibble(value=samples, index=index)

# inflated df. Group obs together into frames
df_ani <- df %>% 
  split(.$index) %>% 
  accumulate(~ bind_rows(.x, .y)) %>% 
  bind_rows(.id = "frame") %>% 
  mutate(frame = as.integer(frame))
head(df_ani)
#> # A tibble: 6 x 3
#>   frame  value index
#>   <int>  <dbl> <int>
#> 1     1  1.37      1
#> 2     2  1.37      1
#> 3     2 -0.565     2
#> 4     3  1.37      1
#> 5     3 -0.565     2
#> 6     3  0.363     3

p_gg <- ggplot(data=df, mapping=aes(x=value))+
  geom_dotplot()
p_gg
#> `stat_bindot()` using `bins = 30`. Pick better value with `binwidth`.

p_anim <- ggplot(data=df_ani, mapping=aes(x=value))+
  geom_dotplot()

anim <- p_anim + 
  transition_manual(frame) +
  ease_aes("linear") +
  enter_fade() +
  exit_fade()
anim
#> `stat_bindot()` using `bins = 30`. Pick better value with `binwidth`.

रिप्रॉज़िट पैकेज (v0.3.0) द्वारा 2020-04-27 को बनाया गया


यह काम करता है, लेकिन बड़े डेटासेट के लिए जल्दी से अक्षम हो जाता है क्योंकि तालिका में डुप्लिकेट डेटा की कई पंक्तियाँ होती हैं।
अधिकतम

उदाहरण के लिए, 5000 अंकों की साजिश करने के लिए, डेटा फ़्रेम में 12 मिलियन पंक्तियाँ हैं :(
अधिकतम

देर से उत्तर के लिए क्षमा करें। फिलहाल व्यस्त हैं। हाँ। में तुम्हारी बात समझ रहा हूँ। मुझे पूरा यकीन है कि इस तरह की समस्या का एक बेहतर और अधिक स्ट्रीप-फॉरवर्ड समाधान होना चाहिए। हालाँकि, मैं अभी भी एक नौसिखिया हूँ और अब तक मेरे पास इसकी सभी संभावनाओं और विशेषताओं की जाँच करने का समय नहीं था। इसलिए, मुझे डर है कि मैं इस समय के लिए बेहतर समाधान नहीं ला सकता।
स्टीफन

3

मुझे लगता है कि यहां यह कल्पना करना महत्वपूर्ण है कि आप इस एनीमेशन को मैन्युअल रूप से कैसे बनाएंगे, जो यह कहना है कि आप परिणामस्वरूप डॉटप्लेट में एक समय में एक अवलोकन जोड़ सकते हैं। इस बात को ध्यान में रखते हुए, मैंने यहां जिस दृष्टिकोण का उपयोग किया, वह एक ऐसी ggplotवस्तु बनाने के लिए था जिसमें भूखंड की परतें = टिप्पणियों की संख्या शामिल थी, फिर परत के माध्यम से परत के माध्यम से कदम transition_layer

# create the ggplot object
df <- data.frame(id=1:100, y=rnorm(100))

p <- ggplot(df, aes(y))

for (i in df$id) {
  p <- p + geom_dotplot(data=df[1:i,])
}

# animation
anim <- p + transition_layers(keep_layers = FALSE) +
    labs(title='Number of dots: {frame}')
animate(anim, end_pause = 20, nframes=120, fps=20)

यहाँ छवि विवरण दर्ज करें

ध्यान दें कि मैंने keep_layers=FALSEओवरप्लॉटिंग से बचने के लिए सेट किया है। यदि आप प्रारंभिक ggplotऑब्जेक्ट को प्लॉट करते हैं , तो आप देखेंगे कि मेरा क्या मतलब है, क्योंकि पहला अवलोकन 100 बार प्लॉट किया गया है, दूसरा 99 बार ... आदि।

बड़े डेटासेट के लिए स्केलिंग के बारे में क्या?

फ्रेम की संख्या = टिप्पणियों की संख्या के बाद से, आपको स्केलेबिलिटी के लिए समायोजित करने की आवश्यकता है। यहां, # फ्रेम को स्थिर रखें, जिसका अर्थ है कि आपको कोड समूह को खंडों में जाने देना है, जिसे मैं seq()फ़ंक्शन के माध्यम से निर्दिष्ट कर रहा हूं length.out=100। नए उदाहरण में भी नोट करें, डेटासेट में शामिल है n=5000। डॉटप्लॉट को फ्रेम में रखने के लिए, आपको डॉट्स के आकार को वास्तव में छोटा करना होगा। मैंने शायद यहाँ डॉट्स को बहुत छोटा कर दिया है, लेकिन आपने इस विचार को जिया है। अब # फ्रेम = टिप्पणियों के समूहों की संख्या।

df <- data.frame(id=1:5000, y=rnorm(5000))

p <- ggplot(df, aes(y))

for (i in seq(0,length(df$id), length.out=100)) {
  p <- p + geom_dotplot(data=df[1:i,], dotsize=0.08)
}

anim <- p + transition_layers(keep_layers=FALSE) +
  labs(title='Frame: {frame}')

animate(anim, end_pause=20, nframes=120, fps=20)

यहाँ छवि विवरण दर्ज करें


यह छोटे डेटासेट के लिए अच्छी तरह से काम करता है, लेकिन बड़े डेटा (n = 5000) को भी अच्छी तरह से मापता नहीं है।
अधिकतम

त्रुटि:: यहाँ त्रुटि के लिए एन = 5000 रिपोर्ट है सी ढेर उपयोग 7,969,904 बहुत पास सीमा है
अधिकतम

हां, यहां उदाहरण में फ्रेम = टिप्पणियों की संख्या है। मैंने स्केलेबिलिटी के लिए उत्तर को संपादित किया है, जहाँ आप # 100 पर स्थिर होते हैं और फिर स्केलिंग करते हैं ताकि फ्रेम = अवलोकन समूहों
chemdork123
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.