Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
534 views
in Technique[技术] by (71.8m points)

r - How to add an external legend to ggpairs()?

I am plotting a scatterplot matrix using ggpairs. I am using 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)

and I get the following plot:

enter image description here

Now, one can easily see that I am getting legends for every plot in the matrix. I would like to have ONLY ONE universal legend for the whole plot. How do I do that? Any help would be much appreciated.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I am working on something similar, this is the approach i would take,

  1. Ensure legends are set to 'TRUE' in the ggpairs function call
  2. Now iterate over the subplots in the plot matrix and remove the legends for each of them and just retain one of them since the densities are all plotted on the same column.

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...