2016-05-10 7 views
7

tl; डॉ मेरी संतुष्टि के लिए ggpairs में एक स्टैंडअलोन किंवदंती (पूरे साजिश में सामान्य रंगों का वर्णन) नहीं मिल सकता है।ggpairs में स्टैंडअलोन किंवदंती (2 ले लो)

लंबाई के लिए खेद है।

मैं GGally::ggpairs (ggplot2 के साथ विभिन्न प्रकार के साजिश मैट्रिक्स ड्राइंग के लिए एक विस्तार पैकेज) का उपयोग करके एक (निचला त्रिकोणीय) जोड़े प्लॉट खींचने की कोशिश कर रहा हूं। यह अनिवार्य रूप से वही प्रश्न है जो How to add an external legend to ggpairs()? है, लेकिन मैं सौंदर्यपूर्ण रूप से उस प्रश्न के उत्तर से संतुष्ट नहीं हूं, इसलिए मैं इसे एक विस्तार के रूप में पोस्ट कर रहा हूं (यदि टिप्पणीकर्ताओं द्वारा सुझाया गया/अनुशंसित किया गया है, तो मैं इस प्रश्न को हटा दूंगा और एक उपहार प्रदान करूंगा इसके बजाय वह सवाल)। विशेष रूप से, मैं पौराणिक कथाओं को उप-प्लॉट फ्रेम के बाहर दिखाई देना चाहूंगा, या तो इसे एक वर्चुअल सबप्लॉट में डालकर अतिरिक्त चौड़ाई को पकड़ने की अनुमति दे सकता हूं, या (आदर्श) इसे एक अलग (खाली) सबप्लॉट में डाल सकता हूं। जैसा कि मैंने नीचे दिखाया है, मेरे दोनों आंशिक समाधानों में समस्याएं हैं।

नकली डेटा:

set.seed(101) 
dd <- data.frame(x=rnorm(100), 
       y=rnorm(100), 
       z=rnorm(100), 
       f=sample(c("a","b"),size=100,replace=TRUE)) 
library(GGally) 

बेस भूखंड समारोह: शीर्ष/अधिकार स्तम्भ ट्रिम करने के लिए

ggfun <- function(...) { 
    ggpairs(dd,mapping = ggplot2::aes(color = f), 
    columns=1:3, 
    lower=list(continuous="points"), 
    diag=list(continuous="blankDiag"), 
    upper=list(continuous="blank"), 
    ...) 
} 

फंक्शन:

trim_gg <- function(gg) { 
    n <- gg$nrow 
    gg$nrow <- gg$ncol <- n-1 
    v <- 1:n^2 
    gg$plots <- gg$plots[v>n & v%%n!=0] 
    gg$xAxisLabels <- gg$xAxisLabels[-n] 
    gg$yAxisLabels <- gg$yAxisLabels[-1] 
    return(gg) 
} 

gg0 <- trim_gg(ggfun(legends=TRUE)) 

बाएँ कॉलम में किंवदंतियों से छुटकारा (के रूप में उपरोक्त लिंक किया गया प्रश्न):

library(ggplot2) ## for theme() 
for (i in 1:2) { 
    inner <- getPlot(gg0,i,1) 
    inner <- inner + theme(legend.position="none") 
    gg0 <- putPlot(gg0,inner,i,1) 
} 
inner <- getPlot(gg0,2,2) 
inner <- inner + theme(legend.position="right") 
gg0 <- putPlot(gg0,inner,2,2) 

enter image description here

समस्याएं:

  • कथा के पीछे खाली पैनल वास्तव में कुछ बातों मास्किंग है; मुझे नहीं पता कि यह सामान्य रूप से पैनल के बाहर क्यों नहीं है, मुझे लगता है कि ggpairs
  • कर रहा है यदि यह पैनल के बाहर (शीर्ष पर या दाएं) के बाहर था, तो मैं कुछ अतिरिक्त छोड़ना चाहता हूं अंतरिक्ष तो पैनल स्वयं एक ही आकार के थे। हालांकि, ggmatrix/ggpairs इस बारे में बहुत ही लचीला दिखता है।

एकमात्र विकल्प मैं दूर करने की कोशिश कर लिया है कथा निकालने और gridExtra::grid.arrange() का उपयोग करके ggplot separate legend and plot पीछा कर रहा है:

g_legend <- function(a.gplot){ 
    tmp <- ggplot_gtable(ggplot_build(a.gplot)) 
    leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
    legend <- tmp$grobs[[leg]] 
    return(legend) 
} 

library(gridExtra) 
grid.arrange(getPlot(gg0,1,1), 
      g_legend(getPlot(gg0,2,2)), 
      getPlot(gg0,2,1), 
      getPlot(gg0,2,2)+theme(legend.position="none"), 
    nrow=2) 

enter image description here

समस्याएं:

  • अक्षरों और लेबलद्वारा दबाए गएवापस आ गए हैं ...

मैंने एक विशेष साजिश के साथ एक पैनल बनाने पर भी विचार किया जिसमें केवल किंवदंती थी (यानी। साजिश को दबाने के लिए theme(SOMETHING=element.blank) का उपयोग करने का प्रयास कर रहा है, लेकिन यह नहीं पता कि इसे कैसे किया जाए।

एक अंतिम उपाय के रूप में, मैं कुल्हाड़ियों जहां अपने आप को उचित कुछ मामूली संशोधन के साथ समाधान 1 के लिए ट्रिम सकता है, लेकिन यह व्यावहारिक रूप से पुनर्रचना है क्या ggpairs पहली जगह में कर रहा है ...

+0

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

+0

मुझे यकीन नहीं है कि यह वही है जो आप चाहते हैं, लेकिन, समाधान 1 में, किंवदंती को खाली पैनल में रखें। यही है, दूसरी अंतिम पंक्ति को इस प्रकार बदलें: 'भीतरी <- आंतरिक + थीम (legend.position = c (.5, 1.5)) ' –

+0

अभी भी समाधान 1 में:' किंवदंतियों 'सेट को' FALSE' पर छोड़ना आसान है कि किंवदंतियों को हटाने की कोई जरूरत नहीं है। –

उत्तर

2

: सबसे पहले, आकर्षित अपनी किंवदंतियों के बिना भूखंडों का मैट्रिक्स (लेकिन अभी भी रंग मैपिंग के साथ)। दूसरा, विकर्ण रिक्त स्थान को हटाने के लिए अपने trim_gg फ़ंक्शन का उपयोग करें। तीसरा, शीर्ष बाएं स्थिति में साजिश के लिए, अपनी किंवदंती खींचें लेकिन इसे खाली स्थान पर दाईं ओर रखें।

data(state) 
dd <- data.frame(state.x77, 
      State = state.name, 
      Abbrev = state.abb, 
      Region = state.region, 
      Division = state.division) 

columns <- c(3, 5, 6, 7) 
colour <- "Region" 

library(GGally) 
library(ggplot2) ## for theme() 

# Base plot 
ggfun <- function(data = NULL, columns = NULL, colour = NULL, legends = FALSE) { 
    ggpairs(data, 
    columns = columns, 
    mapping = ggplot2::aes_string(colour = colour), 
    lower = list(continuous = "points"), 
    diag = list(continuous = "blankDiag"), 
    upper = list(continuous = "blank"), 
    legends = legends) 
} 

# Remove the diagonal elements 
trim_gg <- function(gg) { 
    n <- gg$nrow 
    gg$nrow <- gg$ncol <- n-1 
    v <- 1:n^2 
    gg$plots <- gg$plots[v > n & v%%n != 0] 
    gg$xAxisLabels <- gg$xAxisLabels[-n] 
    gg$yAxisLabels <- gg$yAxisLabels[-1] 
    return(gg) 
} 

# Get the plot 
gg0 <- trim_gg(ggfun(dd, columns, colour)) 

# For plot in position (1,1), draw its legend in the empty panels to the right 
inner <- getPlot(gg0, 1, 1) 

inner <- inner + 
    theme(legend.position = c(1.01, 0.5), 
     legend.direction = "horizontal", 
     legend.justification = "left") + 
    guides(colour = guide_legend(title.position = "top")) 

gg0 <- putPlot(gg0, inner, 1, 1) 
gg0 

enter image description here

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