2014-04-08 7 views
11

मैं ggpairs का उपयोग कर स्कैटरप्लॉट मैट्रिक्स की योजना बना रहा हूं। मैं निम्नलिखित कोड का उपयोग कर रहा:ggpairs() में बाहरी किंवदंती कैसे जोड़ें?

# Load required packages 
require(GGally) 

# Load datasets 
data(state) 
df <- data.frame(state.x77, 
       State = state.name, 
       Abbrev = state.abb, 
       Region = state.region, 
       Division = state.division 
) 
# Create scatterplot matrix 
p <- ggpairs(df, 
      # Columns to include in the matrix 
      columns = c(3,5,6,7), 

      # What to include above diagonal 
      # list(continuous = "points") to mirror 
      # "blank" to turn off 
      upper = "blank", 
      legends=T, 

      # What to include below diagonal 
      lower = list(continuous = "points"), 

      # What to include in the diagonal 
      diag = list(continuous = "density"), 

      # How to label inner plots 
      # internal, none, show 
      axisLabels = "none", 

      # Other aes() parameters 
      colour = "Region", 
      title = "State Scatterplot Matrix" 
) 

# Show the plot 
print(p) 

और मैं निम्नलिखित साजिश मिलती है:

enter image description here

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

+0

क्यों इस 'टैग है shiny' ??? – jlhoward

+0

टैग को हटा दिया, इसे इंगित करने के लिए धन्यवाद। – Patthebug

उत्तर

11

मैं ऐसी ही कुछ पर काम कर रहा हूँ, इस दृष्टिकोण मैं ले जाएगा है,

  1. सुनिश्चित किंवदंतियों ggpairs समारोह कॉल
  2. में 'TRUE' की तैयारी में हैं अब साजिश में subplots से अधिक पुनरावृति मैट्रिक्स और उनमें से प्रत्येक के लिए किंवदंतियों को हटा दें और उनमें से एक को बरकरार रखें क्योंकि घनत्व सभी एक ही कॉलम पर प्लॉट किए गए हैं।

    colIdx <- c(3,5,6,7) 
    
    for (i in 1:length(colIdx)) { 
    
        # Address only the diagonal elements 
        # Get plot out of matrix 
        inner <- getPlot(p, i, i); 
    
        # Add any ggplot2 settings you want (blank grid here) 
        inner <- inner + theme(panel.grid = element_blank()) + 
        theme(axis.text.x = element_blank()) 
    
        # Put it back into the matrix 
        p <- putPlot(p, inner, i, i) 
    
        for (j in 1:length(colIdx)){ 
        if((i==1 & j==1)){ 
    
         # Move legend right 
         inner <- getPlot(p, i, j) 
         inner <- inner + theme(legend.position=c(length(colIdx)-0.25,0.50)) 
         p <- putPlot(p, inner, i, j) 
        } 
        else{ 
    
         # Delete legend 
         inner <- getPlot(p, i, j) 
         inner <- inner + theme(legend.position="none") 
         p <- putPlot(p, inner, i, j) 
        } 
        } 
    } 
    
+0

धन्यवाद, यह पूरी तरह से काम करता है, मैं वही हासिल करता हूं जो मैं उम्मीद कर रहा था। – Patthebug

7

उम्मीद है कि कोई दिखाएगा कि यह ggpairs(...) के साथ कैसे किया जा सकता है। मैं खुद को देखना चाहता हूं। तब तक, यहां एक समाधान है जो ggpairs(...) का उपयोग नहीं करता है, बल्कि पहलू के साथ सादे वेनिला ggplot का उपयोग नहीं करता है।

library(ggplot2) 
library(reshape2) # for melt(...) 
library(plyr)  # for .(...) 
library(data.table) 

xx <- with(df, data.table(id=1:nrow(df), group=Region, df[,c(3,5,6,7)])) 
yy <- melt(xx,id=1:2, variable.name="H", value.name="xval") 
setkey(yy,id,group) 
ww <- yy[,list(V=H,yval=xval),key="id,group"] 
zz <- yy[ww,allow.cartesian=T] 
setkey(zz,H,V,group) 
zz <- zz[,list(id, group, xval, yval, min.x=min(xval),min.y=min(yval), 
       range.x=diff(range(xval)),range.y=diff(range(yval))),by="H,V"] 
d <- zz[H==V,list(x=density(xval)$x, 
        y=min.y+range.y*density(xval)$y/max(density(xval)$y)), 
     by="H,V,group"] 
ggplot(zz)+ 
    geom_point(subset= .(xtfrm(H)<xtfrm(V)), 
      aes(x=xval, y=yval, color=factor(group)), 
      size=3, alpha=0.5)+ 
    geom_line(subset= .(H==V), data=d, aes(x=x, y=y, color=factor(group)))+ 
    facet_grid(V~H, scales="free")+ 
    scale_color_discrete(name="Region")+ 
    labs(x="", y="") 

मूल विचार melt(...)ggplot (xx) के लिए उचित प्रारूप में अपने df, करने के लिए दो प्रतियां (yy और ww) बनाने के लिए और यहाँ एक कार्तीय चलाने id और group के आधार पर शामिल होने के (है id सिर्फ एक पंक्ति संख्या है और groupRegion चर) है, zz बनाने के लिए। हमें बाहरी रूप से घनत्व की गणना करने और स्केल करने की आवश्यकता है (डेटा तालिका d में)। इसके बावजूद, यह अभी भी ggpairs(...) से तेज़ी से चलता है।

+0

आपके उत्तर के लिए धन्यवाद। क्या हम ऊपरी त्रिभुज मैट्रिक्स से छुटकारा पा सकते हैं जो बहुत योगदान नहीं दे रहा है? शुरुआत में मेरे लिए ggpairs का उपयोग करने का कारण केवल प्रासंगिक जानकारी प्रदर्शित करना था। – Patthebug

+1

नहीं। स्वतंत्र रूप से पहलू विषयों को सेट करना संभव नहीं है। – jlhoward

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