লক্ষ লক্ষ পয়েন্ট উপস্থিত থাকলে আরও দক্ষতার সাথে ডেটা প্লট করার পরিসংখ্যান পদ্ধতি?


31

আমি লক্ষ করি যে লক্ষ লক্ষ পয়েন্ট উপস্থিত থাকলে প্লটগুলি তৈরি করতে দীর্ঘ সময় নিতে পারে - পয়েন্টগুলি পৃথকভাবে প্লট করা হয়েছে তা অবাক করে না ing তদুপরি, এই জাতীয় প্লটগুলি প্রায়শই খুব বিশৃঙ্খলাযুক্ত এবং দরকারী হয়ে ওঠে are পয়েন্টগুলির মধ্যে অনেকগুলি ওভারল্যাপ হয়ে একটি কালো ভর তৈরি করে এবং সেই ভরতে আরও পয়েন্টের পরিকল্পনা করতে অনেক সময় ব্যয় করা হয়।

স্ট্যান্ডার্ড স্ক্যাটারপ্লোটে বৃহত্তর ডেটা উপস্থাপনের জন্য কি কোনও পরিসংখ্যানগত বিকল্প রয়েছে ? আমি ঘনত্বের প্লটটি বিবেচনা করেছি, তবে এর বাইরে আর কী বিকল্প রয়েছে?এন


1
রৈখিক প্লটগুলির সাথে কিছু সমাধানের জন্য, stats.stackexchange.com/questions/35220/… দেখুন
হোবার

উত্তর:


13

এটি কোনও প্রস্তুত সমাধান ছাড়াই একটি কঠিন কাজ (এটি অবশ্যই কারণ ঘনত্বের প্লট তাই লোভনীয় ফলব্যাক যা আসলেই কেউ যত্ন করে না)। তো তুমি কি করতে পার?

যদি সেগুলি সত্যই ওভারল্যাপ করে (যেমন ঠিক একই এক্স এবং ওয়াই স্থানাঙ্ক) এবং আপনি আলফা ব্যবহার করছেন না, তবে সর্বোত্তম ধারণাটি কেবল ওভারল্যাপটি হ্রাস করেই ব্যবহার করা হবে unique (আলফা সহ, এটি এই জাতীয় গোষ্ঠীর উপরে সংশ্লেষিত হতে পারে)।

যদি তা না হয় তবে আপনি স্থায়িত্বগুলি নিকটস্থ পিক্সেলগুলিতে ম্যানুয়ালি গোল করতে পারেন এবং পূর্ববর্তী পদ্ধতিটি ব্যবহার করতে পারেন (তবে এটি একটি নোংরা সমাধান)।

পরিশেষে, আপনি সর্বাধিক ঘন অঞ্চলে পয়েন্ট সাবমল করতে কেবল এটি ব্যবহার করতে একটি ঘনত্বের প্লট তৈরি করতে পারেন। অন্যদিকে এটি হুবহু একই প্লট তৈরি করবে না এবং যথাযথভাবে সুর না করা হলে নিদর্শনগুলি প্রবর্তন করতে পারে।


5
uniqueবৃত্তাকার দ্বারা বা গোল করে ওভারল্যাপ হ্রাস করার ফলে পক্ষপাতদুষ্ট (প্রতারণামূলক) প্লট হতে পারে। হালকা বা সূর্যমুখী প্লটগুলির সাথে কিছু গ্রাফিকাল মাধ্যমের মাধ্যমে ওভারল্যাপের পরিমাণটি চিহ্নিত করা গুরুত্বপূর্ণ।
হোবার

44

hexbin প্যাকেজ যা কার্যকরী কাগজ / ড্যান কার দ্বারা পদ্ধতি। পিডিএফ চিত্র আরো বিস্তারিত জানার যা আমি নিচে উদ্ধৃত আছে:

1। সংক্ষিপ্ত বিবরণ

হেক্সাগন বিনিং হ'ল বিভাজনযুক্ত হিস্টগ্রামের একটি ফর্ম যা বড় এন এর সাথে ডেটাসেটগুলিতে স্ট্রাকচারটি দেখার জন্য দরকারী। হেক্সাগন বিনিংয়ের অন্তর্নিহিত ধারণাটি অত্যন্ত সহজ;

  1. সেটের উপরের এক্সওয়াই প্লেনটি (রেঞ্জ (এক্স), রেঞ্জ (y)) হেক্সাগনগুলির একটি নিয়মিত গ্রিড দ্বারা টেসলেটযুক্ত হয়।
  2. প্রতিটি ষড়ভুজ হয়ে যাওয়া পয়েন্টের সংখ্যা গণনা করা হয় এবং একটি ডেটা স্ট্রাকচারে সংরক্ষণ করা হয়
  3. গণনা> 0 সহ হেক্সাগনগুলি একটি রঙের র‌্যাম্প ব্যবহার করে বা গণনাগুলির অনুপাত অনুসারে ষড়্ভুজটির ব্যাসার্ধের পরিবর্তিত হয়। অন্তর্নিহিত অ্যালগরিদম সহ ডেটাসেটের কাঠামো প্রদর্শনের জন্য অত্যন্ত দ্রুত এবং কার্যকরএন106

গ্রিডের আকার এবং কালার র‌্যাম্পের কাটগুলি যদি চতুর ফ্যাশনে বেছে নেওয়া হয় তথ্যের মধ্যে অন্তর্নিহিত কাঠামোটি বিন্যাসিত প্লটগুলিতে উত্থিত হওয়া উচিত। হিস্টোগ্রামে যেমন প্রয়োগ করা হয় তেমনই সতর্কীকরণ হেক্সাগন বিনিংয়ের ক্ষেত্রে প্রযোজ্য এবং বিনিং পরামিতিগুলি বেছে নেওয়ার ক্ষেত্রে যত্ন নেওয়া উচিত


4
এটি একটি দুর্দান্ত। ডাক্তার ঠিক কি আদেশ করলেন।
রোমান Luštrik

13
(+1) এছাড়াও আগ্রহের, smoothScatter {RColorBrewer}এবং densCols {grDevices}। আমি জেনেটিক ডেটা থেকে হাজার থেকে মিলিয়ন পয়েন্টের সাথে এটি বেশ ভালভাবে কাজ করে তা নিশ্চিত করতে পারি।
chl

2
থ্রিডি ডেটা থাকলে কী হবে? (
স্ক্যাটারপ্লট

অন্যকে কিছুটা সময় সাশ্রয় করতে - আরও ভাল ডিফল্ট / ক্রিয়াকলাপ করতে আমি 2 টি মন্তব্য মতামত হিসাবে স্মুথস্ক্যাটারকে পেয়েছি।
চার্লি

16

আমাকে অবশ্যই স্বীকার করতে হবে যে আমি আপনার শেষ অনুচ্ছেদটি পুরোপুরি বুঝতে পারি না:

"আমি ঘনত্বের প্লট খুঁজছি না (যদিও এটি প্রায়শই দরকারী) তবে আমি সাধারণ প্লট কল হিসাবে একই আউটপুট চাই তবে সম্ভব হলে কয়েক মিলিয়ন ওভারপ্লটের চেয়ে অনেক দ্রুত" "

আপনি কী ধরণের প্লট (ফাংশন) সন্ধান করছেন তাও অস্পষ্ট।

আপনার মেট্রিক ভেরিয়েবলগুলি দেওয়া আছে, আপনি ষড়ভুজ বিনিত প্লট বা সানফ্লাওয়ার প্লটগুলি ব্যবহারকারীর সন্ধান করতে পারেন। আরও রেফারেন্সের জন্য, দেখুন


6

প্রশ্নের আর একটি প্রত্যক্ষ উত্তর হ'ল আরজিএল প্যাকেজ, যা ওপেনজিএল ব্যবহার করে কয়েক মিলিয়ন পয়েন্ট প্লট করতে পারে। এছাড়াও, একটি বিন্দু আকার নির্দিষ্ট করুন (উদাহরণস্বরূপ 3) এবং জনসাধারণের এই কেন্দ্রগুলিকে একচেটিয়া ব্লক হিসাবে দেখতে জুম আউট করুন বা জুম ইন করুন এবং একচেটিয়া হিসাবে ব্যবহৃত হতো এর কাঠামোটি দেখুন - পয়েন্টের আকারগুলি স্থির থাকে তবে পর্দার মধ্যে তাদের মধ্যে দূরত্ব রয়েছে জুমিং উপর নির্ভর করে। আলফা স্তরগুলিও ব্যবহার করা যেতে পারে।


5

আমি কল একটি ফাইল এখানে bigplotfix.R। যদি আপনি এটি উত্স করে থাকেন তবে এটি একটি মোড়কে সংজ্ঞায়িত করবে plot.xyযার জন্য প্লট ডেটাটি "সংকুচিত" করে যখন এটি খুব বড় হয়। ইনপুট ছোট হলে মোড়ক কিছু দেয় না, তবে যদি ইনপুটটি বড় হয় তবে এটি এটিকে কিছু অংশে ভেঙে দেয় এবং প্রতিটি খণ্ডের জন্য সর্বাধিক এবং সর্বনিম্ন x এবং y মান প্লট করে। গুন bigplotfix.Rএছাড়াও rebindsgraphics::plot.xy দিকে ইঙ্গিত করতে করে (একাধিকবার করা ঠিক আছে)।

লক্ষ্য করুন plot.xyমত মান চক্রান্ত পদ্ধতি জন্য "workhorse" ফাংশন plot(), lines()এবংpoints() । সুতরাং আপনি কোনও পরিবর্তন ছাড়াই আপনার কোডগুলিতে এই ফাংশনগুলি ব্যবহার করতে চালিয়ে যেতে পারেন এবং আপনার বড় প্লটগুলি স্বয়ংক্রিয়ভাবে সংকুচিত হবে।

এটি কিছু উদাহরণ আউটপুট। এটি মূলত plot(runif(1e5)), পয়েন্ট এবং লাইন সহ এবং এখানে প্রয়োগ করা "সংকোচনের" সাথে এবং ছাড়াও। সংকোচনের প্রকৃতির কারণে "সংকুচিত পয়েন্টগুলি" প্লটটি মধ্য অঞ্চলটিকে মিস করে তবে "সংক্ষেপিত লাইনগুলি" প্লটটি সঙ্কুচিত মূলটির থেকে অনেক কাছাকাছি দেখায়। সময়গুলি png()ডিভাইসের জন্য; কোনও কারণে পয়েন্টগুলি pngডিভাইসের তুলনায় ডিভাইসে অনেক দ্রুত X11, তবে গতির গতি X11তুলনাযোগ্য ( আমার পরীক্ষাগুলির X11(type="cairo")তুলনায় ধীর ছিল X11(type="Xlib"))।

"bigplotfix.R" পরীক্ষার আউটপুট

আমি এটি লেখার কারণটি হ'ল আমি plot()বড় ডেটাসেটে (যেমন একটি ডাব্লুএভি ফাইল) দুর্ঘটনাক্রমে চালাতে ক্লান্ত হয়ে পড়েছিলাম । এই ধরনের ক্ষেত্রে আমাকে প্লটটি শেষ হওয়ার জন্য কয়েক মিনিট অপেক্ষা করা এবং একটি সিগন্যাল দিয়ে আমার আর সেশনটি সমাপ্ত করার মধ্য দিয়ে বেছে নিতে হবে (যার ফলে আমার সাম্প্রতিক কমান্ডের ইতিহাস এবং ভেরিয়েবলগুলি হারাতে হবে)। এখন আমি যদি প্রতিটি সেশনের আগে এই ফাইলটি লোড করতে মনে করতে পারি তবে আমি আসলে এই ক্ষেত্রে একটি কার্যকর প্লট পেতে পারি। একটি সামান্য সতর্কতা বার্তা ইঙ্গিত দেয় যখন প্লটের ডেটা "সংকুচিত" করা হয়েছিল।

# bigplotfix.R
# 28 Nov 2016

# This file defines a wrapper for plot.xy which checks if the input
# data is longer than a certain maximum limit. If it is, it is
# downsampled before plotting. For 3 million input points, I got
# speed-ups of 10-100x. Note that if you want the output to look the
# same as the "uncompressed" version, you should be drawing lines,
# because the compression involves taking maximum and minimum values
# of blocks of points (try running test_bigplotfix() for a visual
# explanation). Also, no sorting is done on the input points, so
# things could get weird if they are out of order.
test_bigplotfix = function() {
  oldpar=par();
  par(mfrow=c(2,2))
  n=1e5;
  r=runif(n)
  bigplotfix_verbose<<-T
  mytitle=function(t,m) { title(main=sprintf("%s; elapsed=%0.4f s",m,t["elapsed"])) }
  mytime=function(m,e) { t=system.time(e); mytitle(t,m); }

  oldbigplotfix_maxlen = bigplotfix_maxlen
  bigplotfix_maxlen <<- 1e3;

  mytime("Compressed, points",plot(r));
  mytime("Compressed, lines",plot(r,type="l"));
  bigplotfix_maxlen <<- n
  mytime("Uncompressed, points",plot(r));
  mytime("Uncompressed, lines",plot(r,type="l"));
  par(oldpar);
  bigplotfix_maxlen <<- oldbigplotfix_maxlen
  bigplotfix_verbose <<- F
}

bigplotfix_verbose=F

downsample_xy = function(xy, n, xlog=F) {
  msg=if(bigplotfix_verbose) { message } else { function(...) { NULL } }
  msg("Finding range");
  r=range(xy$x);
  msg("Finding breaks");
  if(xlog) {
    breaks=exp(seq(from=log(r[1]),to=log(r[2]),length.out=n))
  } else {
    breaks=seq(from=r[1],to=r[2],length.out=n)
  }
  msg("Calling findInterval");
  ## cuts=cut(xy$x,breaks);
  # findInterval is much faster than cuts!
  cuts = findInterval(xy$x,breaks);
  if(0) {
    msg("In aggregate 1");
    dmax = aggregate(list(x=xy$x, y=xy$y), by=list(cuts=cuts), max)
    dmax$cuts = NULL;
    msg("In aggregate 2");
    dmin = aggregate(list(x=xy$x, y=xy$y), by=list(cuts=cuts), min)
    dmin$cuts = NULL;
  } else { # use data.table for MUCH faster aggregates
    # (see http://stackoverflow.com/questions/7722493/how-does-one-aggregate-and-summarize-data-quickly)
    suppressMessages(library(data.table))
    msg("In data.table");
    dt = data.table(x=xy$x,y=xy$y,cuts=cuts)
    msg("In data.table aggregate 1");
    dmax = dt[,list(x=max(x),y=max(y)),keyby="cuts"]
    dmax$cuts=NULL;
    msg("In data.table aggregate 2");
    dmin = dt[,list(x=min(x),y=min(y)),keyby="cuts"]
    dmin$cuts=NULL;
    #  ans = data_t[,list(A = sum(count), B = mean(count)), by = 'PID,Time,Site']
  }
  msg("In rep, rbind");
  # interleave rows (copied from a SO answer)
  s <- rep(1:n, each = 2) + (0:1) * n
  xy = rbind(dmin,dmax)[s,];
  xy
}

library(graphics);
# make sure we don't create infinite recursion if someone sources
# this file twice
if(!exists("old_plot.xy")) {
  old_plot.xy = graphics::plot.xy
}

bigplotfix_maxlen = 1e4

# formals copied from graphics::plot.xy
my_plot.xy = function(xy, type, pch = par("pch"), lty = par("lty"),
  col = par("col"), bg = NA, cex = 1, lwd = par("lwd"),
  ...) {

  if(bigplotfix_verbose) {
    message("In bigplotfix's plot.xy\n");
  }

  mycall=match.call();
  len=length(xy$x)
  if(len>bigplotfix_maxlen) {
    warning("bigplotfix.R (plot.xy): too many points (",len,"), compressing to ",bigplotfix_maxlen,"\n");
    xy = downsample_xy(xy, bigplotfix_maxlen, xlog=par("xlog"));
    mycall$xy=xy
  }
  mycall[[1]]=as.symbol("old_plot.xy");

  eval(mycall,envir=parent.frame());
}

# new binding solution adapted from Henrik Bengtsson
# https://stat.ethz.ch/pipermail/r-help/2008-August/171217.html
rebindPackageVar = function(pkg, name, new) {
  # assignInNamespace() no longer works here, thanks nannies
  ns=asNamespace(pkg)
  unlockBinding(name,ns)
  assign(name,new,envir=asNamespace(pkg),inherits=F)
  assign(name,new,envir=globalenv())
  lockBinding(name,ns)
}
rebindPackageVar("graphics", "plot.xy", my_plot.xy);

0

হতে পারে আমি আমার পদ্ধতির জন্য এড়িয়ে যাব, আমার এক গবেষণা অধ্যাপকের খারাপ স্মৃতি লোকগুলিকে বিভাগগুলিতে অনুবাদ করে ভাল ডেটা ফেলে দেওয়ার জন্য চিৎকার করছে (অবশ্যই আমি এখন একদিন রাজি নই), জানেন না। যাইহোক, আপনি যদি একটি ছড়িয়ে ছিটিয়ে থাকা সম্পর্কে কথা বলছেন তবে আমারও একই সমস্যা ছিল। এখন, যখন আমার কাছে সাংখ্যিক ডেটা রয়েছে, বিশ্লেষণের জন্য এটির শ্রেণিবদ্ধ করা আমার পক্ষে খুব বেশি অর্থবোধ করে না। তবে ভিজ্যুয়ালাইজিং একটি ভিন্ন গল্প। আমি যা খুঁজে পেয়েছি যে আমার পক্ষে সবচেয়ে ভাল কাজ করে তা হ'ল প্রথমে (1) কাট ফাংশনটি ব্যবহার করে আপনার স্বতন্ত্র ভেরিয়েবলটিকে গ্রুপগুলিতে বিভক্ত করা। আপনি গ্রুপ সংখ্যা নিয়ে প্রায় খেলতে পারেন, এবং তারপরে (2) IV এর কাটা সংস্করণের বিরুদ্ধে কেবল ডিভি প্লট করতে পারেন। আর সেই ঘৃণ্য স্ক্রেটার প্লটের পরিবর্তে বাক্স প্লট তৈরি করবে। আমি বহিরাগতদের প্লটটি তৈরি করার অপসারণের প্রস্তাব দিই (প্লট কমান্ডের আউটলাইন = ফলস বিকল্পটি ব্যবহার করুন)। আবার, আমি শ্রেণিবদ্ধ করে এবং তারপরে বিশ্লেষণ করে পুরোপুরি ভাল সংখ্যার ডেটা কখনই নষ্ট করব না। অনেকগুলি সমস্যা এটি করছে। যদিও আমি জানি এটি বিতর্কের মর্মস্পর্শী বিষয়। তবে এটি বিশেষত ডেটা থেকে কিছুটা দৃষ্টিভঙ্গি তৈরি করার লক্ষ্যে করা হয়েছে, এটি থেকে আমি দেখেছি তেমন কোনও ক্ষতি হয় না। আমি 10M হিসাবে বৃহত্তর ডেটা প্লট করেছি এবং এখনও এই পদ্ধতি থেকে এটিকে বোঝার ব্যবস্থা করেছি। আশা করি এইটি কাজ করবে! শুভেচ্ছান্তে! এটি থেকে দেখা হয়েছে। আমি 10M হিসাবে বৃহত্তর ডেটা প্লট করেছি এবং এখনও এই পদ্ধতি থেকে এটিকে বোঝার ব্যবস্থা করেছি। আশা করি এইটি কাজ করবে! শুভেচ্ছান্তে! এটি থেকে দেখা হয়েছে। আমি 10M হিসাবে বৃহত্তর ডেটা প্লট করেছি এবং এখনও এই পদ্ধতি থেকে এটিকে বোঝার ব্যবস্থা করেছি। আশা করি এইটি কাজ করবে! শুভেচ্ছান্তে!


0

বড় সময়ের সিরিজের জন্য, আমি স্মুথস্ক্যাটার (বেস আর এর অংশ কম নয়) পছন্দ করতে পেরেছি । আমাকে প্রায়শই কিছু অতিরিক্ত ডেটা অন্তর্ভুক্ত করতে হয়, এবং বেসিক প্লট এপিআই সংরক্ষণ করা সত্যই সহায়ক, উদাহরণস্বরূপ:

set.seed(1)
ra <- rnorm(n = 100000, sd = 1, mean = 0)
smoothScatter(ra)
abline(v=25000, col=2)
text(25000, 0, "Event 1", col=2)

যা আপনাকে দেয় (আপনি যদি ডিজাইনটি ক্ষমা করেন):

ছড়িয়ে ছিটিয়ে থাকা উদাহরণ

এটি সর্বদা উপলব্ধ এবং প্রচুর ডেটাসেটগুলির সাথে ভালভাবে কাজ করে, তাই আপনার কাছে অন্তত কী আছে তা একবার দেখে নেওয়া ভাল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.