बहुत सारे बिंदुओं के साथ स्कैटरप्लॉट


126

मैं दो चर की साजिश करने की कोशिश कर रहा हूं जहां एन = 700 के। समस्या यह है कि बहुत अधिक ओवरलैप है, ताकि प्लॉट ज्यादातर काले रंग का एक ठोस ब्लॉक बन जाए। क्या कोई ग्रेस्केल "क्लाउड" होने का कोई तरीका है जहां भूखंड का अंधेरा एक क्षेत्र में अंकों की संख्या का एक कार्य है? दूसरे शब्दों में, मैं व्यक्तिगत अंक दिखाने के बजाय, एक भूखंड को "क्लाउड" बनाना चाहता हूं, जिसमें एक क्षेत्र में जितने अधिक अंक हों, उतना गहरा वह क्षेत्र।


4
ऐसा लगता है कि आप एक हीटमैप ढूंढ

जवाबों:


145

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

यह करना आसान है ggplot2:

df <- data.frame(x = rnorm(5000),y=rnorm(5000))
ggplot(df,aes(x=x,y=y)) + geom_point(alpha = 0.3)

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

इससे निपटने का एक और सुविधाजनक तरीका है (और शायद आपके पास जितने अधिक अंक हों) हेक्सागोनल बिनिंग:

ggplot(df,aes(x=x,y=y)) + stat_binhex()

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

और नियमित रूप से पुरानी आयताकार द्विपनी (छोड़ी गई छवि) भी है, जो आपके पारंपरिक हीटमैप की तरह है:

ggplot(df,aes(x=x,y=y)) + geom_bin2d()

1
मैं रंगों को कैसे बदल सकता हूं? मैं अब नीले से काले पैमाने पर हो रहा हूं, जबकि मैं रेग, हरा नीला स्केल प्राप्त करना चाहता हूं।
user1007742

@ user1007742 scale_fill_gradient()अपने स्वयं के निम्न और उच्च रंगों का उपयोग करें और निर्दिष्ट करें, या scale_fill_brewer()अनुक्रमिक पट्टियों में से एक का उपयोग करें और चुनें।
जोरन

@ जोरान धन्यवाद, जो अब काम कर रहा है। अंकों के प्रकार / आकार को बदलने के बारे में कैसे? मुझे या तो षट्भुज या वर्ग मिलता है। मुझे बस साधारण डॉट्स चाहिए। जब मैं geom_point () का उपयोग करता हूं, तो यह मुझे त्रुटि देता है।
user1007742

1
@ user1007742 खैर, इसे "हेक्सागोनल बिनिंग" कहा जाता है! ;) यह "अंक" की साजिश नहीं कर रहा है यह पूरे क्षेत्र को हेक्सागोनल (या आयताकार) डिब्बे में विभाजित कर रहा है और फिर बस उस बिन में कितने बिंदुओं के आधार पर डिब्बे को रंग रहा है। तो संक्षिप्त जवाब है "आप नहीं कर सकते"। यदि आप अलग-अलग आकार चाहते हैं, तो आपको geom_point()प्रत्येक व्यक्तिगत बिंदु का उपयोग और प्लॉट करना होगा।
जोरन

अगर मेरे पास 3 डी डेटा है तो क्या होगा?
15

60

आप ggsubplotपैकेज पर भी नजर डाल सकते हैं । यह पैकेज उन विशेषताओं को लागू करता है, जो 2011 में हेडली विकम द्वारा प्रस्तुत की गई थीं ( http://blog.revolutionanalytics.com/2011/10/ggplot2-for-big-data.html )।

(निम्नलिखित में, मैं "अंक" शामिल करता हूं-उदाहरण के प्रयोजनों के लिए।)

library(ggplot2)
library(ggsubplot)

# Make up some data
set.seed(955)
dat <- data.frame(cond = rep(c("A", "B"), each=5000),
                  xvar = c(rep(1:20,250) + rnorm(5000,sd=5),rep(16:35,250) + rnorm(5000,sd=5)),
                  yvar = c(rep(1:20,250) + rnorm(5000,sd=5),rep(16:35,250) + rnorm(5000,sd=5)))


# Scatterplot with subplots (simple)
ggplot(dat, aes(x=xvar, y=yvar)) +
  geom_point(shape=1) +
  geom_subplot2d(aes(xvar, yvar,
                     subplot = geom_bar(aes(rep("dummy", length(xvar)), ..count..))), bins = c(15,15), ref = NULL, width = rel(0.8), ply.aes = FALSE)

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

हालाँकि, यदि आपके पास नियंत्रण के लिए तीसरा चर है, तो यह चट्टानें हैं।

# Scatterplot with subplots (including a third variable) 

ggplot(dat, aes(x=xvar, y=yvar)) +
  geom_point(shape=1, aes(color = factor(cond))) +
  geom_subplot2d(aes(xvar, yvar,
                     subplot = geom_bar(aes(cond, ..count.., fill = cond))),
                 bins = c(15,15), ref = NULL, width = rel(0.8), ply.aes = FALSE)  

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

या एक और दृष्टिकोण का उपयोग करना होगा smoothScatter():

smoothScatter(dat[2:3])

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


3
कि दूसरी साजिश महान है!
रिकार्डो सपोर्ट

अगर मेरे पास 3 डी डेटा है तो क्या होगा?
स्कंद

2
@ स्कान: आप इसके लिए एक नया प्रश्न खोल सकते हैं।
मजोम

दुर्भाग्य से पैकेज ggsubplot को अब मेनटेन नहीं किया गया है और इसे क्रिप्टो रेपो से हटा दिया गया है ... क्या आपको एक ऐसे वैकल्पिक पैकेज के बारे में पता है जिसका इस्तेमाल पहले दो से ऊपर की तरह प्लॉट बनाने के लिए किया जा सकता है?
डाईहेलस्टे

यदि आप R & ggplot2 के पुराने संस्करण का उपयोग करते हैं, तो आपको इसे काम करने में सक्षम होना चाहिए
माजोम

59

कई अच्छे विकल्पों का अवलोकन ggplot2:

library(ggplot2)
x <- rnorm(n = 10000)
y <- rnorm(n = 10000, sd=2) + x
df <- data.frame(x, y)

विकल्प A: पारदर्शी बिंदु

o1 <- ggplot(df, aes(x, y)) +
  geom_point(alpha = 0.05)

विकल्प बी: घनत्व आकृति जोड़ें

o2 <- ggplot(df, aes(x, y)) +
  geom_point(alpha = 0.05) +
  geom_density_2d()

विकल्प सी: भरे हुए घनत्व आकृति जोड़ें

o3 <- ggplot(df, aes(x, y)) +
  stat_density_2d(aes(fill = stat(level)), geom = 'polygon') +
  scale_fill_viridis_c(name = "density") +
  geom_point(shape = '.')

विकल्प डी: घनत्व हीटमैप

o4 <- ggplot(df, aes(x, y)) +
  stat_density_2d(aes(fill = stat(density)), geom = 'raster', contour = FALSE) +       
  scale_fill_viridis_c() +
  coord_cartesian(expand = FALSE) +
  geom_point(shape = '.', col = 'white')

विकल्प ई: हेक्सबिन

o5 <- ggplot(df, aes(x, y)) +
  geom_hex() +
  scale_fill_viridis_c() +
  geom_point(shape = '.', col = 'white')

विकल्प F: आसनों

o6 <- ggplot(df, aes(x, y)) +
  geom_point(alpha = 0.1) +
  geom_rug(alpha = 0.01)

एक आकृति में मिलाएं:

cowplot::plot_grid(
  o1, o2, o3, o4, o5, o6,
  ncol = 2, labels = 'AUTO', align = 'v', axis = 'lr'
)

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


1
यह एक बहुत अच्छी तरह से निर्धारित जवाब है कि मुझे लगता है कि थोड़ा अधिक वोट के हकदार हैं।
लालोचेज़िया

मुझे एक त्रुटि देता है scale_fill_viridis_c () में त्रुटि: फ़ंक्शन नहीं मिल सका "scale_fill_viridis_c"
JustGettinStarted

अद्यतन ggplot2, पुनः स्थापित ggplot2 और पुनः लोड ggplot2। फ्लॉप त्रुटि को ठीक करें। अलग से स्थापित 'viridis' पैकेज और जो मुझे 'scale_fill_viridis' फ़ंक्शन का उपयोग करने देता है, लेकिन 'scale_fill_viridis_c' फ़ंक्शन का उपयोग नहीं करता है जो अभी भी एक ही त्रुटि देता है
JustGettinStarted

ओह, मुझे विश्वास है वहाँ कोई समस्या नहीं। बस त्रुटि की तह तक पहुँचने की कोशिश कर रहा हूँ।
JustGettinStarted

51

अल्फा सम्मिश्रण के रूप में अच्छी तरह से आधार ग्राफिक्स के साथ करना आसान है।

df <- data.frame(x = rnorm(5000),y=rnorm(5000))
with(df, plot(x, y, col="#00000033"))

#आरजीबी हेक्स में रंग के बाद पहले छह नंबर और आखिरी दो अस्पष्टता हैं, फिर से हेक्स में, इसलिए 33 ~ 3/16 वीं अपारदर्शी।

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


20
बस थोड़ा सा संदर्भ जोड़ने के लिए, "# 000000" रंग काला है और रंग के अंत में जोड़ा गया "33" अस्पष्टता की डिग्री है --- यहां, 33%।
चार्ली

अतिरिक्त स्पष्टीकरण के लिए धन्यवाद।
हारून ने

एकदम सही समझ में आता है। धन्यवाद, हारून और चार्ली दोनों।
user702432

12
मामूली नोट; संख्या हेक्स में हैं इसलिए 33 वास्तव में 3/16 वीं अपारदर्शी है।
हारून ने

45

आप घनत्व समोच्च रेखाओं ( ggplot2) का उपयोग कर सकते हैं :

df <- data.frame(x = rnorm(15000),y=rnorm(15000))
ggplot(df,aes(x=x,y=y)) + geom_point() + geom_density2d()

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

या अल्फा सम्मिश्रण के साथ घनत्व आकृति को मिलाएं:

ggplot(df,aes(x=x,y=y)) + 
    geom_point(colour="blue", alpha=0.2) + 
    geom_density2d(colour="black")

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


29

आपको उपयोगी hexbinपैकेज मिल सकता है । के मदद पृष्ठ से hexbinplot:

library(hexbin)
mixdata <- data.frame(x = c(rnorm(5000),rnorm(5000,4,1.5)),
                      y = c(rnorm(5000),rnorm(5000,2,3)),
                      a = gl(2, 5000))
hexbinplot(y ~ x | a, mixdata)

hexbinplot


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

3 डी डेटा के लिए हेक्सबिन की तरह कुछ भी?
15

8

geom_pointdenistyसे ggpointdensityपैकेज आप एक ही समय में घनत्व और व्यक्तिगत डेटा बिंदुओं कल्पना की अनुमति देता है (हाल ही में लुकास क्रेमर और साइमन ऐन्डर्स (2019) द्वारा विकसित):

library(ggplot2)
# install.packages("ggpointdensity")
library(ggpointdensity)

df <- data.frame(x = rnorm(5000), y = rnorm(5000))
ggplot(df, aes(x=x, y=y)) + geom_pointdensity() + scale_color_viridis_c()


2

इस प्रकार के डेटा को प्लॉट करने की मेरी पसंदीदा विधि इस प्रश्न में वर्णित है - एक बिखराव-घनत्व प्लॉट । विचार एक स्कैटर-प्लॉट करने के लिए है लेकिन उनके घनत्व (मोटे तौर पर उस क्षेत्र में ओवरलैप की मात्रा) द्वारा बिंदुओं को रंगने के लिए।

यह एक साथ:

  • स्पष्ट रूप से आउटलेर का स्थान दिखाता है, और
  • साजिश के घने क्षेत्र में किसी भी संरचना का पता चलता है।

लिंक किए गए प्रश्न के शीर्ष उत्तर से परिणाम इस प्रकार है:

बिखराव-घनत्व प्लॉट


1
यह मेरा पसंदीदा तरीका भी है। इसमें कैसे हासिल किया जाए, इसके लिए मेरा जवाब देखें R
जनवरी-GLX
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.