2013-06-13 7 views
11

कई बिंदुओं को ओवरलैप करते समय स्कैटर प्लॉट को समझना मुश्किल हो सकता है, क्योंकि इस ओवरलैपिंग किसी विशेष क्षेत्र में डेटा की घनत्व को अस्पष्ट करता है। एक समाधान प्लॉट किए गए बिंदुओं के लिए अर्ध-पारदर्शी रंगों का उपयोग करना है, ताकि अपारदर्शी क्षेत्र इंगित करता है कि उन निर्देशांकों में कई अवलोकन मौजूद हैं।आर स्कैटर प्लॉट: प्रतीक रंग ओवरलैपिंग पॉइंट्स की संख्या का प्रतिनिधित्व करता है

नीचे आर में मेरे काले और सफेद समाधान का एक उदाहरण है:

MyGray <- rgb(t(col2rgb("black")), alpha=50, maxColorValue=255) 
x1 <- rnorm(n=1E3, sd=2) 
x2 <- x1*1.2 + rnorm(n=1E3, sd=2) 
dev.new(width=3.5, height=5) 
par(mfrow=c(2,1), mar=c(2.5,2.5,0.5,0.5), ps=10, cex=1.15) 
plot(x1, x2, ylab="", xlab="", pch=20, col=MyGray) 
plot(x1, x2, ylab="", xlab="", pch=20, col="black") 

The advantages of using opacity to indicate point density

हालांकि, मैं हाल ही में this article in PNAS, जो एक समान एक दृष्टिकोण लिया भर में आया है, लेकिन गर्मी नक्शा रंगाई में इस्तेमाल किया अस्पष्टता के विपरीत एक संकेतक के रूप में कितने अंक ओवरलैपिंग थे। आलेख ओपन एक्सेस है, इसलिए कोई भी .pdf डाउनलोड कर सकता है और चित्रा 1 को देख सकता है, जिसमें उस ग्राफ का एक प्रासंगिक उदाहरण है जिसे मैं बनाना चाहता हूं। इस पेपर के विधियों सेक्शन इंगित करता है कि मैटलैब में विश्लेषण किए गए थे। ,

Figure 1 from Flombaum et al. 2013, PNAS

मैं आर कि रंग, नहीं अस्पष्टता इस्तेमाल किया में एक बिखराव साजिश कैसे बना होगा एक के रूप में:

सुविधा के लिए, यहाँ उपरोक्त लेख से चित्रा 1 के एक छोटे से हिस्से है बिंदु घनत्व के संकेतक?

स्टार्टर्स के लिए, आर उपयोगकर्ता लाइब्रेरी मेंका उपयोग करके इस मैटलैब रंग योजना तक पहुंच सकते हैं।

क्या उपरोक्त आलेख के चित्रा 1 के समान चित्र बनाने का कोई आसान तरीका है, लेकिन आर में? धन्यवाद!

उत्तर

26

एक विकल्प प्रत्येक बिंदु पर कर्नेल घनत्व निकालने के लिए densCols() का उपयोग करना है। उन घनत्वों को वांछित रंग रैंप में मैप करना, और स्थानीय घनत्व को बढ़ाने के क्रम में प्लॉटिंग पॉइंट्स आपको लिंक किए गए आलेख में बहुत अधिक साजिश देता है।

## Data in a data.frame 
x1 <- rnorm(n=1E3, sd=2) 
x2 <- x1*1.2 + rnorm(n=1E3, sd=2) 
df <- data.frame(x1,x2) 

## Use densCols() output to get density at each point 
x <- densCols(x1,x2, colramp=colorRampPalette(c("black", "white"))) 
df$dens <- col2rgb(x)[1,] + 1L 

## Map densities to colors 
cols <- colorRampPalette(c("#000099", "#00FEFF", "#45FE4F", 
          "#FCFF00", "#FF9400", "#FF3100"))(256) 
df$col <- cols[df$dens] 

## Plot it, reordering rows so that densest points are plotted on top 
plot(x2~x1, data=df[order(df$dens),], pch=20, col=col, cex=2) 

enter image description here

+0

+10 अगर मैं कर सकता तो भी अधिक वोट दूंगा। –

+0

यह वास्तव में वह जवाब दिखता है जिसकी मैं उम्मीद कर रहा था ... धन्यवाद! – rbatt

+0

@ जोशओब्रायन: यह कमाल है! दो प्रश्न: 1) आप यहां अपने उत्तर में छवि को कैसे जोड़ सकते थे? 2) यहां एक किंवदंती कैसे जोड़ें? – Shambho

3

आप इसके लिए smoothScatter का उपयोग कर सकते हैं।

colramp = colorRampPalette(c('white', 'blue', 'green', 'yellow', 'red')) 
smoothScatter(x1, x2, colramp=colramp) 
+0

प्रतिक्रिया के लिए धन्यवाद - यह लगभग सही विचार है, लेकिन मैं अंकों की समरेखण से बचने के लिए चाहते हैं। मैंने बैंडविड्थ इत्यादि के साथ खेलने की कोशिश की, लेकिन ऐसा लगता है कि यह फ़ंक्शन अलग-अलग बिंदुओं को बनाए रखने में सक्षम नहीं होगा। – rbatt

+0

अच्छा लगता है! इस या संबंधित 'densCols()' फ़ंक्शन के बारे में नहीं पता था जिसे मैंने अभी अपने उत्तर में उपयोग किया था। –

5

आप एक समान प्रभाव हेक्सागोनल binning करने से,, रंग प्रत्येक षट्भुज षट्भुज में अंकों की संख्या के आधार पर प्राप्त कर सकते हैं hexagons को क्षेत्र विभाजित करते हैं। हेक्सबिन पैकेज में ऐसा करने के लिए कार्य हैं और ggplot2 पैकेज में भी फ़ंक्शन हैं।

+1

ggplot2 में क्या फ़ंक्शन यह करता है? – rbatt

+0

@ आरबीएटी, 'stat_binhex' देखें। –

संबंधित मुद्दे