Search code examples
rplotggplot2ggally

Legend using ggpairs


Trying to follow an example made here, I was reproducing the following code:

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

I was supposed to get an image with legend for each plot.

But instead, I am getting one without any legend.

Any tips of why the image I am getting does not have the legends? My particular case needs them!

I am using R v. 3.2.2, and tried both in RStudio and RGui.

Thanks in advance!


Solution

  • There should be a standard way to to it, but I could not find one. The old print function is still there and accessible but as in internal function. Try this instead of the print:

      GGally:::print_ggpairs_old(p)
    

    enter image description here

    And if you add this (thanks to this post answer Legend using ggpairs )

    colidx <- c(3,5,6,7)
    for (i in 1:length(colidx)) {
    
      # Address only the diagonal elements
      # Get plot out of plot-matrix
      inner <- getPlot(p, i, i);
    
      # Add ggplot2 settings (here we remove gridlines)
      inner <- inner + theme(panel.grid = element_blank()) +
        theme(axis.text.x = element_blank())
    
      # Put it back into the plot-matrix
      p <- putPlot(p, inner, i, i)
    
      for (j in 1:length(colidx)){
        if((i==1 & j==1)){
    
          # Move the upper-left legend to the far right of the plot
          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 the other legends
          inner <- getPlot(p, i, j)
          inner <- inner + theme(legend.position="none")
          p <- putPlot(p, inner, i, j)
        }
      }
    }
    

    You get something much better:

    enter image description here