2009-12-26 19 views
7

मैं कई स्थितियों में आया हूं जहां मैं वास्तव में होना चाहिए उससे अधिक अंक प्लॉट करना चाहता हूं - मुख्य धारणा यह है कि जब मैं अपने भूखंडों को लोगों के साथ साझा करता हूं या उन्हें कागजात में एम्बेड करता हूं, तो वे बहुत अधिक जगह पर कब्जा करते हैं। डेटाफ्रेम में यादृच्छिक रूप से नमूना पंक्तियों के लिए यह बहुत सरल है।आर में अधिकतम साजिश बिंदु?

अगर मैं एक बिंदु साजिश के लिए वास्तव में एक नमूने के तौर पर चाहते हैं, यह कहना आसान है:

ggplot(x,y,data=myDf[sample(1:nrow(myDf),1000),]) 

हालांकि, यदि कोई और अधिक प्रभावी (आदर्श डिब्बाबंद) साजिश अंकों की संख्या को निर्दिष्ट करने के तरीके थे मैं सोच रहा था जैसे कि आपका वास्तविक डेटा साजिश में सटीक रूप से प्रतिबिंबित होता है। तो यहां एक उदाहरण है। मान लीजिए कि मैं एक भारी पूंछ वितरण के सीसीडीएफ की तरह कुछ प्लॉट कर रहा हूं, उदाहरण के लिए

ccdf <- function(myList,density=FALSE) 
{ 
    # generates the CCDF of a list or vector 
    freqs = table(myList) 
    X = rev(as.numeric(names(freqs))) 
    Y =cumsum(rev(as.list(freqs))); 
    data.frame(x=X,count=Y) 
} 
qplot(x,count,data=ccdf(rlnorm(10000,3,2.4)),log='xy') 

यह एक साजिश है, जहां x & y अक्ष तेजी से सघन हो का उत्पादन करेगा। यहां बड़े एक्स या वाई मानों के लिए प्लॉट किए गए कम नमूनों के लिए आदर्श होगा।

क्या किसी के पास इसी तरह के मुद्दों से निपटने के लिए कोई सुझाव या सुझाव हैं?

धन्यवाद, -e

+0

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

+0

फिर उप-नमूनाकरण आपकी सबसे अच्छी शर्त हो सकती है। यह निश्चित रूप से 'गैर-वर्दी' नमूनाकरण के साथ किया जा सकता है, ताकि आप पूंछ से अधिक अंक (या यहां तक ​​कि सभी) रखना चाहें लेकिन नाटकीय रूप से मुख्य भाग को पतला कर सकते हैं। लेकिन यह समस्या-विशिष्ट लगता है ताकि आपको इसे स्वयं पकाएं। –

उत्तर

4

एक्स-अक्ष के संबंध में डाउनस्प्लिंग प्लॉट के लिए यहां एक संभावित समाधान है, यदि यह लॉग रूपांतरित हो गया है। यह लोग इन x- अक्ष बदल देती है, कि मात्रा दौर, और कहा कि बिन में मंझला एक्स मूल्य उठाता है:

downsampled_qplot <- function(x,y,data,rounding=0, ...) { 
    # assumes we are doing log=xy or log=x 
    group = factor(round(log(data$x),rounding)) 
    d <- do.call(rbind, by(data, group, 
    function(X) X[order(X$x)[floor(length(X)/2)],])) 
    qplot(x,count,data=d, ...) 
} 

ccdf() ऊपर से की परिभाषा का उपयोग करना, हम तो वितरण की CCDF के मूल कथानक की तुलना कर सकते

myccdf=ccdf(rlnorm(10000,3,2.4)) 

qplot(x,count,data=myccdf,log='xy',main='original') 

downsampled_qplot(x,count,data=myccdf,log='xy',rounding=1,main='rounding = 1') 

: downsampled संस्करण के साथ
downsampled_qplot(x,count,data=myccdf,log='xy',rounding=0,main='rounding = 0') 

पीडीएफ प्रारूप में, मूल कथानक 640K तक ले जाता है, और downsampled संस्करणों 20K और 8K क्रमश पर कब्जा।

+0

के साथ गोल करने के बजाए, कोई भी आम तौर पर कुछ ऐसा कर सकता है: समूह = कट (लॉग (डेटा $ x), बी = अधिकतम बिंदु) – eytan

8

मैं नहीं बल्कि इस तरह के PDF या इस स्थिति के लिए ईपीएस के रूप में वेक्टर आधारित ग्राफिक्स से png फ़ाइलों का उपयोग करते हैं। फाइलें बहुत छोटी हैं, हालांकि आप संकल्प खो देते हैं।

यदि यह एक अधिक पारंपरिक स्कैटरप्लॉट है, तो अर्द्ध पारदर्शी रंगों का उपयोग करने से भी मदद मिलती है, साथ ही ओवर-प्लॉटिंग समस्या को हल करने में भी मदद मिलती है। उदाहरण के लिए,

x <- rnorm(10000); y <- rnorm(10000) 
qplot(x, y, colour=I(alpha("blue",1/25))) 
5

परे रोब के सुझाव, एक भूखंड समारोह मुझे पसंद है के लिए आप hexbin है, क्योंकि यह 'पतले' करता है, एक उदाहरण at the R Graph Gallery है।

+3

या, ggplot2, 'geom =" hex "' – hadley

2

मैं या तो छवि फ़ाइलें (PNG या JPEG उपकरणों) बनाने चाहते हैं Rob के रूप में पहले ही उल्लेख किया, या मैं एक 2D histogram. 2 डी हिस्टोग्राम के लिए एक वैकल्पिक एक smoothed scatterplot है चाहिए, यह एक ऐसी ही ग्राफिक बनाता है लेकिन एक और अधिक चिकनी कटऑफ है अंतरिक्ष के घने से दुर्लभ क्षेत्रों से।

यदि आपने पहले कभी देखा नहीं है addictedtor, यह एक लायक है। इसमें छवियों और नमूना कोड के साथ आर में उत्पन्न कुछ बहुत अच्छे ग्राफिक्स हैं।

यहाँ addictedtor साइट से नमूना कोड:

2-डी हिस्टोग्राम:

require(gplots) 

# example data, bivariate normal, no correlation 
x <- rnorm(2000, sd=4) 
y <- rnorm(2000, sd=1) 

# separate scales for each axis, this looks circular 
hist2d(x,y, nbins=50, col = c("white",heat.colors(16))) 
rug(x,side=1) 
rug(y,side=2) 
box() 

smoothscatter:

library("geneplotter") ## from BioConductor 
require("RColorBrewer") ## from CRAN 

x1 <- matrix(rnorm(1e4), ncol=2) 
x2 <- matrix(rnorm(1e4, mean=3, sd=1.5), ncol=2) 
x <- rbind(x1,x2) 

layout(matrix(1:4, ncol=2, byrow=TRUE)) 
op <- par(mar=rep(2,4)) 
smoothScatter(x, nrpoints=0) 
smoothScatter(x) 
smoothScatter(x, nrpoints=Inf, 
       colramp=colorRampPalette(brewer.pal(9,"YlOrRd")), 
       bandwidth=40) 
colors <- densCols(x) 
plot(x, col=colors, pch=20) 

par(op) 
संबंधित मुद्दे