পর্যবেক্ষণ দ্বারা একটি হিস্টোগ্রাম পর্যবেক্ষণ তৈরি করতে গিগনিমেট ব্যবহার করবেন? বৃহত্তর ডেটাসেটের জন্য কাজ করতে হবে (~ 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আপনার বিন্দু আঁকতেও ব্যবহার করতে পারেন :)

জিওমপয়েন্ট (ভিউপোর্টের আকারের সাথে পরীক্ষা এবং ত্রুটি)

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)

কিছু অনুপ্রেরণা থেকে: জিজিপ্লট ডটপ্লট : জিওম_ডটপ্লট এর সঠিক ব্যবহার কী?


আমি পয়েন্টগুলি একের পর এক আসার জন্য সন্ধান করছি, ওয়াই মান অনুসারে সারিগুলিতে নয়।
সর্বোচ্চ

2
@ ম্যাক্স আপডেট দেখুন - কেবল y এর পরিবর্তে সূচক দিন।
তেজবো

3

এটা চেষ্টা কর. প্রাথমিক ধারণাটি হ'ল obs to ফ্রেমগুলিতে গ্রুপ করা, অর্থাত্ সূচক দ্বারা বিভক্ত হওয়া এবং তারপরে নমুনাগুলিকে ফ্রেমগুলিতে সংগ্রহ করা, অর্থাৎ ফ্রেম 1 এ কেবল প্রথম obs প্রদর্শিত হয়, ফ্রেম 2 obs 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`.

2020-04-27 তারিখে ডিপেক্স প্যাকেজ দ্বারা নির্মিত (v0.3.0)


এটি কাজ করে তবে বৃহত্তর ডেটাসেটের জন্য দ্রুত অনিবার্য হয়ে ওঠে যেহেতু টেবিলটিতে ডুপ্লিকেট করা ডেটার অনেকগুলি সারি থাকে।
সর্বোচ্চ

উদাহরণস্বরূপ, 5000 পয়েন্ট চক্রান্ত, তথ্য ফ্রেম 12 মিলিয়ন সারি :( হয়েছে
সর্বোচ্চ

দেরী উত্তরের জন্য দুঃখিত. এই মুহুর্তে বিট ব্যস্ত। হ্যাঁ. আমি আপনার পয়েন্ট দেখুন. আমি নিশ্চিত যে এই ধরণের সমস্যার আরও ভাল এবং আরও সহজ-সরল সমাধান থাকতে হবে quite তবে, আমি এখনও বৌদ্ধিকভাবে নবজাতক এবং এখনও পর্যন্ত এর সম্ভাব্যতা এবং বৈশিষ্ট্যগুলি যাচাই করার জন্য আমার কাছে সময় ছিল না। সুতরাং, আমি ভয় করছি আমি এই মুহুর্তের জন্য আরও ভাল সমাধান নিয়ে আসতে পারব না।
স্টিফান

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 বার ... ইত্যাদি প্লট করা হয়েছে etc.

বড় ডেটাসেটগুলির জন্য স্কেলিং সম্পর্কে কী?

যেহেতু ফ্রেমের সংখ্যা = পর্যবেক্ষণের সংখ্যা, আপনাকে স্কেলিবিলিটির জন্য সামঞ্জস্য করতে হবে। এখানে, কেবল # ফ্রেমকে অবিচ্ছিন্ন রাখুন, যার অর্থ আপনাকে কোড গ্রুপের ফ্রেমগুলিকে সেগমেন্টে রাখতে হবে, যা আমি 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)

এখানে চিত্র বর্ণনা লিখুন


এটি ছোট ডেটাসেটের জন্য ভাল কাজ করে, তবে মাঝারি আকারের বড় ডেটাতেও (এন = 5000) ভাল স্কেল করে না।
সর্বাধিক

এখানে এন = 5000 এর ত্রুটিটি প্রতিবেদন করা হয়েছে: ত্রুটি: সি স্ট্যাকের ব্যবহার 7969904 সীমাটির খুব কাছাকাছি
সর্বাধিক

হ্যাঁ, এখানে উদাহরণের ফ্রেম = পর্যবেক্ষণের সংখ্যা রয়েছে। আমি স্কেলাবিলিটির জন্য উত্তরটি সম্পাদনা করেছি, যেখানে আপনি # ফ্রেমকে 100 এ ধ্রুবক ধরে রাখেন এবং তারপরে স্কেলিং করুন যাতে ফ্রেমগুলি = পর্যবেক্ষণ গোষ্ঠীর
chemdork123
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.