2014-04-08 7 views
11

Ich zeichne eine Streudiagramm-Matrix mit ggpairs. Ich verwende den folgenden Code ein:Wie füge ich eine externe Legende zu ggpairs() hinzu?

# 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) 

und ich erhalte die folgende Handlung:

enter image description here

Nun kann man leicht sehen, dass ich Legenden in der Matrix für jedes Grundstück bin immer. Ich möchte nur eine universelle Legende für das ganze Grundstück haben. Wie mache ich das? Jede Hilfe würde sehr geschätzt werden.

+0

Warum ist das 'shiny' getaggt ??? – jlhoward

+0

Das Tag wurde entfernt, danke, dass Sie darauf hingewiesen haben. – Patthebug

Antwort

11

ich auf etwas ähnlichem arbeite, dann ist dies der Ansatz, den ich nehmen würde,

  1. Sicherstellen, dass Legenden auf ‚true‘ gesetzt wird in dem ggpairs Funktionsaufruf
  2. nun über die Handlungsstränge in der Handlung iterieren matrix und entferne die Legenden für jeden von ihnen und behalte nur einen von ihnen, da die Dichten alle in derselben Spalte aufgetragen sind.

    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

Danke, das funktioniert perfekt, erreicht genau das, was ich mir erhofft habe. – Patthebug

7

Hoffentlich wird jemand zeigen, wie dies mit ggpairs(...) getan werden kann. Ich würde das gerne selbst sehen. Bis dahin ist hier eine Lösung, die nicht ggpairs(...), sondern Plain Vanille ggplot mit Facetten verwendet.

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="") 

Die Grundidee ist es, melt(...) Ihre df in das richtige Format für ggplot (xx), zwei Kopien machen (yy und ww) und ein kartesisches laufen join basierend auf id und group (hier , id ist nur eine Zeilennummer und group ist die Region Variable), um zz zu erstellen. Wir müssen die Dichten extern berechnen und skalieren (in der Datentabelle d). Trotz allem läuft es immer noch schneller als ggpairs(...).

+0

danke für deine antwort. Können wir die obere Dreiecksmatrix loswerden, die nicht viel beiträgt? Der Grund für die Verwendung von ggpairs war für mich zunächst, nur relevante Informationen anzuzeigen. – Patthebug

+1

Nein. Es ist nicht möglich, die Facetthemen unabhängig voneinander einzustellen. – jlhoward