Ggplot2 में सीमांत हिस्टोग्राम के साथ स्कैटरप्लॉट


137

क्या नीचे के नमूने की तरह सीमांत हिस्टोग्राम के साथ स्कैप्लेट्स बनाने का एक तरीका है ggplot2? Matlab में यह scatterhist()फ़ंक्शन है और R के लिए समतुल्य मौजूद है। हालाँकि, मैंने इसे ggplot2 के लिए नहीं देखा है।

सीमांत हिस्टोग्राम के साथ स्कैल्पलॉट

मैंने सिंगल ग्राफ़ बनाकर एक प्रयास शुरू किया, लेकिन उन्हें ठीक से व्यवस्थित करने का तरीका नहीं जानता।

 require(ggplot2)
 x<-rnorm(300)
 y<-rt(300,df=2)
 xy<-data.frame(x,y)
     xhist <- qplot(x, geom="histogram") + scale_x_continuous(limits=c(min(x),max(x))) + opts(axis.text.x = theme_blank(), axis.title.x=theme_blank(), axis.ticks = theme_blank(), aspect.ratio = 5/16, axis.text.y = theme_blank(), axis.title.y=theme_blank(), background.colour="white")
     yhist <- qplot(y, geom="histogram") + coord_flip() + opts(background.fill = "white", background.color ="black")

     yhist <- yhist + scale_x_continuous(limits=c(min(x),max(x))) + opts(axis.text.x = theme_blank(), axis.title.x=theme_blank(), axis.ticks = theme_blank(), aspect.ratio = 16/5, axis.text.y = theme_blank(), axis.title.y=theme_blank() )


     scatter <- qplot(x,y, data=xy)  + scale_x_continuous(limits=c(min(x),max(x))) + scale_y_continuous(limits=c(min(y),max(y)))
none <- qplot(x,y, data=xy) + geom_blank()

और उन्हें यहां तैनात समारोह के साथ व्यवस्थित करना । लेकिन लंबी कहानी को छोटा करने के लिए: क्या इन ग्राफ़ को बनाने का एक तरीका है?


@DWin सही धन्यवाद - लेकिन मुझे लगता है कि मेरे सवाल में बहुत समाधान है। हालाँकि, मुझे लगता है कि geom_rag () आपको नीचे दिए गए बहुत से लगता है!
एसईबी

1
उसी विषय पर हाल ही के ब्लॉग पोस्ट से, जिसमें एक ही विषय है: blog.mckuhn.de/2009/09/learning-ggplot2-2d-plot-with.html भी काफी अच्छा लग रहा है :)
Seb

ग्राफिक्स गैलरी के लिए नई वेबसाइट है: गैलरी.
r-IIImen.com

@ यदि आप सोचते हैं कि आप इसे स्वीकार करते हैं तो ggExtra पैकेज के बारे में "स्वीकार किए गए उत्तर" को बदलने पर विचार कर सकते हैं
डीनएटली

जवाबों:


93

gridExtraपैकेज यहाँ काम करना चाहिए। Ggplot वस्तुओं में से प्रत्येक बनाने से शुरू करें:

hist_top <- ggplot()+geom_histogram(aes(rnorm(100)))
empty <- ggplot()+geom_point(aes(1,1), colour="white")+
         theme(axis.ticks=element_blank(), 
               panel.background=element_blank(), 
               axis.text.x=element_blank(), axis.text.y=element_blank(),           
               axis.title.x=element_blank(), axis.title.y=element_blank())

scatter <- ggplot()+geom_point(aes(rnorm(100), rnorm(100)))
hist_right <- ggplot()+geom_histogram(aes(rnorm(100)))+coord_flip()

फिर ग्रिड का उपयोग करें। अरेंज फंक्शन:

grid.arrange(hist_top, empty, scatter, hist_right, ncol=2, nrow=2, widths=c(4, 1), heights=c(1, 4))

भूखंड


6
प्लेसमेंट प्रदर्शित करने के लिए 1+, लेकिन आप सीमांत हिस्टोग्राम के साथ "लाइन अप" करने के लिए आंतरिक बिखराव चाहते हैं, तो आप यादृच्छिक नमूना फिर से नहीं करना चाहिए।
IRTFM

1
आप सही हे। वे हालांकि समान वितरण से नमूना लेते हैं, इसलिए सीमांत हिस्टोग्राम को स्कैटर प्लॉट से मेल खाना चाहिए।
oeo4b

8
"सिद्धांत" में वे asymptotically "मैच" होंगे; अभ्यास में वे कितनी बार मेल खाएंगे, यह असीम रूप से छोटा है। Ggplot कॉल्स में दिए गए उदाहरण xy <- data.frame(x=rnorm(300), y=rt(300,df=2) )और उपयोग data=xyमें उपयोग करना बहुत आसान है ।
IRTFM

7
मैं इस समाधान की सिफारिश नहीं करूंगा क्योंकि भूखंडों की कुल्हाड़ियों आमतौर पर बिल्कुल संरेखित नहीं करती हैं। उम्मीद है कि ggplot2 के भविष्य के संस्करण कुल्हाड़ियों को संरेखित करना आसान बना देंगे, या यहां तक ​​कि एक प्लॉट पैनल के किनारे पर कस्टम एनोटेशन की अनुमति भी दे सकते हैं (जैसे जाली में अनुकूलित माध्यमिक अक्ष फ़ंक्शन)।
बपतिस्मा

9
नहीं, वे, सामान्य रूप से नहीं करेंगे। ggplot2 वर्तमान में एक भिन्न पैनल चौड़ाई को आउटपुट करता है जो अक्ष लेबल की सीमा के आधार पर बदलता है आदि ggExtra :: align.plots पर एक तरह का हैक देखने के लिए है जो वर्तमान में अक्षों को संरेखित करने के लिए आवश्यक है।
बैपटिस्ट

115

यह पूरी तरह से उत्तरदायी उत्तर नहीं है, लेकिन यह बहुत सरल है। यह सीमांत घनत्व प्रदर्शित करने के लिए एक वैकल्पिक विधि दिखाता है और यह भी कि पारदर्शिता का समर्थन करने वाले ग्राफिकल आउटपुट के लिए अल्फा स्तरों का उपयोग कैसे करें:

scatter <- qplot(x,y, data=xy)  + 
         scale_x_continuous(limits=c(min(x),max(x))) + 
         scale_y_continuous(limits=c(min(y),max(y))) + 
         geom_rug(col=rgb(.5,0,0,alpha=.2))
scatter

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


5
यह घनत्व दिखाने का एक दिलचस्प तरीका है। इस उत्तर को जोड़ने के लिए धन्यवाद। :)
मिशेल

21
यह ध्यान दिया जाना चाहिए कि यह विधि सीमांत हिस्टोग्राम लगाने की तुलना में बहुत अधिक सामान्य है। वास्तव में, प्रकाशित लेखों में गलीचा वाले भूखंड आम हैं जहां मैंने सीमांत इतिहासग्राम के साथ प्रकाशित लेख कभी नहीं देखा है।
जू वांग १

बहुत ही रोचक और सहज वैकल्पिक उत्तर! और बहुत ही सरल! कोई आश्चर्य नहीं कि इसे सही उत्तर की तुलना में अधिक वोट मिलता है। मेरी समझ यह है कि यह अनिवार्य रूप से एक-आयामी हीटमैप है : जहाँ भी भीड़ होती है वहाँ आसन गहरे होते हैं। मेरी एकमात्र चिंता यह होगी कि हीटमैप का रिज़ॉल्यूशन हिस्टोग्राम जितना अधिक नहीं होगा। जैसे। जब प्लॉट छोटा होता है, तो सभी आसनों को एक साथ निचोड़ा जाएगा, जिससे वितरण को समझना मुश्किल हो जाता है। जबकि हिस्टोग्राम सीमा से ग्रस्त नहीं है। विचार के लिए धन्यवाद!
हांगबोझू

94

यह थोड़ी देर हो सकती है, लेकिन मैंने एक पैकेज बनाने का फैसला किया (ggExtra ) क्योंकि इसमें थोड़ा सा कोड शामिल था और लिखने में थकाऊ हो सकता है। पैकेज कुछ सामान्य मुद्दे को भी संबोधित करने की कोशिश करता है जैसे कि यह सुनिश्चित करना कि अगर कोई शीर्षक या पाठ बढ़े हुए हैं, तो भी प्लॉट एक दूसरे के साथ इनलाइन होंगे।

मूल विचार के समान है जो यहां दिए गए उत्तर देता है, लेकिन यह उससे थोड़ा आगे निकल जाता है। यहाँ एक उदाहरण है कि 1000 अंकों के यादृच्छिक सेट में सीमांत हिस्टोग्राम को कैसे जोड़ा जाए। उम्मीद है कि इससे भविष्य में हिस्टोग्राम / घनत्व प्लॉट जोड़ना आसान हो जाएगा।

GgExtra पैकेज से लिंक करें

library(ggplot2)
df <- data.frame(x = rnorm(1000, 50, 10), y = rnorm(1000, 50, 10))
p <- ggplot(df, aes(x, y)) + geom_point() + theme_classic()
ggExtra::ggMarginal(p, type = "histogram")

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


1
पैकेज के लिए बहुत बहुत धन्यवाद। यह बॉक्स से बाहर काम करता है!
heroxbd

क्या इस पैकेज के साथ रंग द्वारा वर्गीकृत वस्तुओं के लिए सीमांत घनत्व वाले भूखंडों को खींचना संभव है?
GegznaV

नहीं, यह उस तरह का तर्क नहीं है
डीनअटाली

1
@jrrr मुझे यकीन नहीं है कि क्या काम नहीं कर रहा है और आप कौन से मुद्दे हैं, लेकिन एक नोटबुक में प्रस्तुत करने के बारे में जीथब पर हाल ही में एक मुद्दा था और एक समाधान भी है, यह उपयोगी हो सकता है github.com/daattali/ ggExtra / मुद्दों / 89
डीनअटाली

1
@GegznaV, यदि आप अभी भी रंग द्वारा समूहीकृत सीमांत घनत्व वाले भूखंडों का रास्ता खोज रहे हैं, तो यह ggExtra 0.9: ggMarginal (p, टाइप = "घनत्व", आकार 5: groupColour = TRUE) के साथ संभव है
MartineJ

46

इसके अलावा, हमारे बाद ऐसा करने वाले लोगों के लिए कुछ खोज समय बचाने के लिए।

किंवदंतियों, अक्ष लेबल, अक्ष ग्रंथ, टिक्स एक दूसरे से दूर बहाव वाले भूखंड बनाते हैं, इसलिए आपका प्लॉट बदसूरत और असंगत लगेगा।

आप इनमें से कुछ थीम सेटिंग्स का उपयोग करके इसे ठीक कर सकते हैं,

+theme(legend.position = "none",          
       axis.title.x = element_blank(),
       axis.title.y = element_blank(),
       axis.text.x = element_blank(),
       axis.text.y = element_blank(), 
       plot.margin = unit(c(3,-5.5,4,3), "mm"))

और तराजू को संरेखित करें,

+scale_x_continuous(breaks = 0:6,
                    limits = c(0,6),
                    expand = c(.05,.05))

इसलिए परिणाम ठीक दिखेंगे:

एक उदाहरण


3
प्लॉट पैनलों को संरेखित करने के लिए एक अधिक विश्वसनीय समाधान के लिए इसे देखें
बैपटिस्ट

हाँ। मेरा उत्तर पुराना है, प्रस्तावित @baptiste समाधान का उपयोग करें।
लोरिनिइ नित्राई

@LorincNyitrai क्या आप इस प्लॉट को बनाने के लिए अपना कोड साझा कर सकते हैं। मेरी एक शर्त भी है जहां मैं 2 समूहों के लिए सीमांत वितरण के साथ ggplot2 में एक प्रेसिजन-रिकॉल स्कैटर प्लॉट बनाना चाहता हूं, लेकिन मैं 2 समूहों के लिए सीमांत वितरण करने में असमर्थ हूं। धन्यवाद
नौसिखिया

@ नई, यह उत्तर 3 वर्ष पुराना है, जितना संभव हो उतना पुराना है। Rdocumentation.org/packages/gtable/versions/0.2.0/topics/gtable या कुछ समान का उपयोग करें ।
लोरिनकी नित्राई

29

वितरण के सीमांत संकेतकों की सामान्य भावना में बॉन्डेडस्ट के उत्तर पर बस एक बहुत ही मामूली बदलाव ।

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

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

x<-rnorm(300)
y<-rt(300,df=10)
xy<-data.frame(x,y)

require(ggplot2); require(grid)
# make the basic plot object
ggplot(xy, aes(x, y)) +        
  # set the locations of the x-axis labels as Tukey's five numbers   
  scale_x_continuous(limit=c(min(x), max(x)), 
                     breaks=round(fivenum(x),1)) +     
  # ditto for y-axis labels 
  scale_y_continuous(limit=c(min(y), max(y)),
                     breaks=round(fivenum(y),1)) +     
  # specify points
  geom_point() +
  # specify that we want the rug plot
  geom_rug(size=0.1) +   
  # improve the data/ink ratio
  theme_set(theme_minimal(base_size = 18))

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


12

जैसा कि विभिन्न समूहों की तुलना करते समय इस तरह के कथानक के लिए कोई संतोषजनक समाधान नहीं था, मैंने ऐसा करने के लिए एक फ़ंक्शन लिखा ।

यह समूहीकृत और अनियंत्रित डेटा दोनों के लिए काम करता है और अतिरिक्त ग्राफिकल मापदंडों को स्वीकार करता है:

marginal_plot(x = iris$Sepal.Width, y = iris$Sepal.Length)

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

marginal_plot(x = Sepal.Width, y = Sepal.Length, group = Species, data = iris, bw = "nrd", lm_formula = NULL, xlab = "Sepal width", ylab = "Sepal length", pch = 15, cex = 0.5)

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


9

मैंने पैकेज ( ggpubr) पाया है जो इस समस्या के लिए बहुत अच्छा काम करता है और यह डेटा प्रदर्शित करने के लिए कई संभावनाओं पर विचार करता है।

पैकेज का लिंक यहां है , और इस लिंक में आपको इसका उपयोग करने के लिए एक अच्छा ट्यूटोरियल मिलेगा। पूर्णता के लिए, मैं अपने द्वारा पुन: प्रस्तुत किए गए उदाहरणों में से एक को संलग्न करता हूं।

मैंने पहली बार पैकेज स्थापित किया है (इसके लिए आवश्यक है devtools)

if(!require(devtools)) install.packages("devtools")
devtools::install_github("kassambara/ggpubr")

विभिन्न समूहों के लिए अलग-अलग हिस्टोग्राम प्रदर्शित करने के विशेष उदाहरण के लिए, यह संबंध में उल्लेख करता है ggExtra: "एक सीमा ggExtraयह है कि यह तितर बितर भूखंड और सीमांत भूखंडों में कई समूहों के साथ सामना नहीं कर सकता है। नीचे आर कोड में, हम एक उदाहरण प्रदान करते हैं। cowplotपैकेज का उपयोग कर समाधान । " मेरे मामले में, मुझे बाद का पैकेज स्थापित करना पड़ा:

install.packages("cowplot")

और मैंने इस कोड का अनुसरण किया:

# Scatter plot colored by groups ("Species")
sp <- ggscatter(iris, x = "Sepal.Length", y = "Sepal.Width",
            color = "Species", palette = "jco",
            size = 3, alpha = 0.6)+
border()                                         
# Marginal density plot of x (top panel) and y (right panel)
xplot <- ggdensity(iris, "Sepal.Length", fill = "Species",
               palette = "jco")
yplot <- ggdensity(iris, "Sepal.Width", fill = "Species", 
               palette = "jco")+
rotate()
# Cleaning the plots
sp <- sp + rremove("legend")
yplot <- yplot + clean_theme() + rremove("legend") 
xplot <- xplot + clean_theme() + rremove("legend")
# Arranging the plot using cowplot
library(cowplot)
plot_grid(xplot, NULL, sp, yplot, ncol = 2, align = "hv", 
      rel_widths = c(2, 1), rel_heights = c(1, 2))

जो मेरे लिए ठीक काम किया:

आइरिस ने सीमांत हिस्टोग्राम स्क्रैपप्लेट सेट किया

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


बीच में एक वर्ग बनाने के लिए आपको क्या करने की आवश्यकता होगी?
16

डॉट्स के आकार का मतलब है? तर्क जोड़ने का प्रयास करें shape = 19में ggscatterयहाँ
अल्फ पास्कु

7

आप आसानी से ggstatsplot का उपयोग करके सीमांत हिस्टोग्राम के साथ आकर्षक स्कैटरप्लॉट बना सकते हैं (यह भी फिट होगा और एक मॉडल का वर्णन करेगा):

data(iris)

library(ggstatsplot)

ggscatterstats(
  data = iris,                                          
  x = Sepal.Length,                                                  
  y = Sepal.Width,
  xlab = "Sepal Length",
  ylab = "Sepal Width",
  marginal = TRUE,
  marginal.type = "histogram",
  centrality.para = "mean",
  margins = "both",
  title = "Relationship between Sepal Length and Sepal Width",
  messages = FALSE
)

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

या थोड़ा और आकर्षक (डिफ़ॉल्ट रूप से) ggpubr :

devtools::install_github("kassambara/ggpubr")
library(ggpubr)

ggscatterhist(
  iris, x = "Sepal.Length", y = "Sepal.Width",
  color = "Species", # comment out this and last line to remove the split by species
  margin.plot = "histogram", # I'd suggest removing this line to get density plots
  margin.params = list(fill = "Species", color = "black", size = 0.2)
)

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

अपडेट करें:

जैसा कि @aickley द्वारा सुझाव दिया गया था कि मैंने प्लॉट बनाने के लिए विकासात्मक संस्करण का उपयोग किया है।


1
Y- अक्ष पर हिस्टोग्राम गलत है क्योंकि यह x- अक्ष पर एक की एक प्रति मात्र है। यह केवल हाल ही में github.com/kassambara/ggpubr/issues/85 तय किया गया है ।
इकले

7

यह एक पुराना प्रश्न है, लेकिन मुझे लगा कि हाल ही में इसी समस्या के सामने आने के बाद से अपडेट को पोस्ट करना उपयोगी होगा (मदद के लिए स्टेफनी म्यूएलर का धन्यवाद!)।

ग्रिडएक्स्ट्रा के कार्यों का उपयोग करते हुए सबसे अधिक उत्तर दिया गया है, लेकिन कुल्हाड़ियों को संरेखित करना मुश्किल / आसान है, जैसा कि टिप्पणियों में बताया गया है। इसे अब ggExtra पैकेज से कमांड ggMarginal का उपयोग करके हल किया जा सकता है, जैसे:

#load packages
library(tidyverse) #for creating dummy dataset only
library(ggExtra)

#create dummy data
a = round(rnorm(1000,mean=10,sd=6),digits=0)
b = runif(1000,min=1.0,max=1.6)*a
b = b+runif(1000,min=9,max=15)

DummyData <- data.frame(var1 = b, var2 = a) %>% 
  filter(var1 > 0 & var2 > 0)

#plot
p = ggplot(DummyData, aes(var1, var2)) + geom_point(alpha=0.3)
ggMarginal(p, type = "histogram")

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


बस एहसास हुआ कि यह मूल ggExtra पैकेज डेवलपर द्वारा दूसरे उत्तर में पोस्ट किया गया है। ऊपर बताए गए कारण के लिए, इसके बजाय स्वीकार किए गए उत्तर को बनाने की सिफारिश करेंगे!
विक्टोरिया औयुंग

6

मैंने उन विकल्पों की कोशिश की, लेकिन परिणामों या संतुष्ट कोड से संतुष्ट नहीं था एक को वहां पहुंचने के लिए उपयोग करने की आवश्यकता होगी। लकी मी, थॉमस लिन पेडरसेन ने सिर्फ पैचवर्क नामक एक पैकेज विकसित किया , जो काम को बहुत ही सुंदर तरीके से किया जाता है।

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

library(ggplot2)

x <- rnorm(300)
y <- rt(300, df = 2)
xy <- data.frame(x, y)

plot1 <- ggplot(xy, aes(x = x, y = y)) + 
  geom_point() 

dens1 <- ggplot(xy, aes(x = x)) + 
  geom_histogram(color = "black", fill = "white") + 
  theme_void()

dens2 <- ggplot(xy, aes(x = y)) + 
  geom_histogram(color = "black", fill = "white") + 
  theme_void() + 
  coord_flip()

एकमात्र काम करना बाकी है, उन भूखंडों को एक साधारण से जोड़ना +और फ़ंक्शन के साथ लेआउट निर्दिष्ट करना है plot_layout()

library(patchwork)

dens1 + plot_spacer() + plot1 + dens2 + 
  plot_layout(
    ncol = 2, 
    nrow = 2, 
    widths = c(4, 1),
    heights = c(1, 4)
  ) 

फ़ंक्शन plot_spacer()ऊपरी दाएँ कोने में एक खाली प्लॉट जोड़ता है। अन्य सभी तर्क आत्म-व्याख्यात्मक होने चाहिए।

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

चूंकि हिस्टोग्राम बड़े रूप से चुने गए बैंडविड्थ पर निर्भर करते हैं, इसलिए कोई घनत्व प्लॉट पसंद करने के लिए तर्क दे सकता है। कुछ छोटे संशोधनों के साथ किसी को नज़र रखने के डेटा के लिए उदाहरण मिलेगा।

library(ggpubr)

plot1 <- ggplot(df, aes(x = Density, y = Face_sum, color = Group)) + 
  geom_point(aes(color = Group), size = 3) + 
  geom_point(shape = 1, color = "black", size = 3) + 
  stat_smooth(method = "lm", fullrange = TRUE) +
  geom_rug() + 
  scale_y_continuous(name = "Number of fixated faces", 
                     limits = c(0, 205), expand = c(0, 0)) + 
  scale_x_continuous(name = "Population density (lg10)", 
                     limits = c(1, 4), expand = c(0, 0)) + 
  theme_pubr() +
  theme(legend.position = c(0.15, 0.9)) 

dens1 <- ggplot(df, aes(x = Density, fill = Group)) + 
  geom_density(alpha = 0.4) + 
  theme_void() + 
  theme(legend.position = "none")

dens2 <- ggplot(df, aes(x = Face_sum, fill = Group)) + 
  geom_density(alpha = 0.4) + 
  theme_void() + 
  theme(legend.position = "none") + 
  coord_flip()

dens1 + plot_spacer() + plot1 + dens2 + 
  plot_layout(ncol = 2, nrow = 2, widths = c(4, 1), heights = c(1, 4))

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

हालांकि इस बिंदु पर डेटा प्रदान नहीं किया गया है, अंतर्निहित सिद्धांत स्पष्ट होना चाहिए।


4

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

निम्नलिखित सीमांत हिस्टोग्राम के साथ एक बिखरा हुआ (ठीक से संरेखित) बनाता है।

library("ggplot2")
library("cowplot")

# Set up scatterplot
scatterplot <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
  geom_point(size = 3, alpha = 0.6) +
  guides(color = FALSE) +
  theme(plot.margin = margin())


# Define marginal histogram
marginal_distribution <- function(x, var, group) {
  ggplot(x, aes_string(x = var, fill = group)) +
    geom_histogram(bins = 30, alpha = 0.4, position = "identity") +
    # geom_density(alpha = 0.4, size = 0.1) +
    guides(fill = FALSE) +
    theme_void() +
    theme(plot.margin = margin())
}

# Set up marginal histograms
x_hist <- marginal_distribution(iris, "Sepal.Length", "Species")
y_hist <- marginal_distribution(iris, "Sepal.Width", "Species") +
  coord_flip()

# Align histograms with scatterplot
aligned_x_hist <- align_plots(x_hist, scatterplot, align = "v")[[1]]
aligned_y_hist <- align_plots(y_hist, scatterplot, align = "h")[[1]]

# Arrange plots
plot_grid(
  aligned_x_hist
  , NULL
  , scatterplot
  , aligned_y_hist
  , ncol = 2
  , nrow = 2
  , rel_heights = c(0.2, 1)
  , rel_widths = c(1, 0.2)
)

सीमांत हिस्टोग्राम के साथ स्कैल्पलॉट

इसके बजाय एक 2 डी-घनत्व की साजिश रचने के लिए, बस मुख्य भूखंड को बदलें।

# Set up 2D-density plot
contour_plot <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
  stat_density_2d(aes(alpha = ..piece..)) +
  guides(color = FALSE, alpha = FALSE) +
  theme(plot.margin = margin())

# Arrange plots
plot_grid(
  aligned_x_hist
  , NULL
  , contour_plot
  , aligned_y_hist
  , ncol = 2
  , nrow = 2
  , rel_heights = c(0.2, 1)
  , rel_widths = c(1, 0.2)
)

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


3

एक और समाधान का उपयोग कर ggpubrऔर cowplot, लेकिन यहां हम प्लॉट का उपयोग करके बनाते हैं cowplot::axis_canvasऔर उन्हें मूल प्लॉट में जोड़ते हैं cowplot::insert_xaxis_grob:

library(cowplot) 
library(ggpubr)

# Create main plot
plot_main <- ggplot(faithful, aes(eruptions, waiting)) +
  geom_point()

# Create marginal plots
# Use geom_density/histogram for whatever you plotted on x/y axis 
plot_x <- axis_canvas(plot_main, axis = "x") +
  geom_density(aes(eruptions), faithful)
plot_y <- axis_canvas(plot_main, axis = "y", coord_flip = TRUE) +
  geom_density(aes(waiting), faithful) +
  coord_flip()

# Combine all plots into one
plot_final <- insert_xaxis_grob(plot_main, plot_x, position = "top")
plot_final <- insert_yaxis_grob(plot_final, plot_y, position = "right")
ggdraw(plot_final)

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


2

आजकल, कम से कम एक सीआरएएन पैकेज है जो अपने सीमांत हिस्टोग्राम के साथ स्कैल्पलॉट बनाता है।

library(psych)
scatterHist(rnorm(1000), runif(1000))

बिखराव से नमूना साजिश


0

आप के इंटरैक्टिव रूप का उपयोग कर सकते हैं ggExtra::ggMarginalGadget(yourplot) और बॉक्सप्लॉट्स, वायलिन प्लॉट्स, घनत्व प्लॉट्स और हिस्टोग्राम्स सफ़ेद आसान के बीच चयन ।

उसके जैसा

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