Corner Labels in ggplot2

前端 未结 4 1690
后悔当初
后悔当初 2020-12-29 10:31

I\'m interested in trying to create simple corner labels for a multipanel figure I am preparing in ggplot. This is similar to this previously asked question, but the answers

相关标签:
4条回答
  • 2020-12-29 11:15

    I had the same problem and came up with the following solution, which is a bit different:

    loading r packages

    library(ggplot2)
    library(grid)
    library(gridExtra)
    

    example data

    a <- 1:20
    b <- sample(a, 20)
    c <- sample(b, 20)
    d <- sample(c, 20)
    

    create a data frame

    mydata   <- data.frame(a, b, c, d)
    

    create example plots

    myplot1  <- ggplot(mydata, aes(x=a, y=b)) + geom_point()
    myplot2  <- ggplot(mydata, aes(x=b, y=c)) + geom_point()
    myplot3  <- ggplot(mydata, aes(x=c, y=d)) + geom_point()
    myplot4  <- ggplot(mydata, aes(x=d, y=a)) + geom_point()
    

    set corner labels

    myplot1 <- arrangeGrob(myplot1, top = textGrob("A", x = unit(0, "npc")
             , y   = unit(1, "npc"), just=c("left","top"),
             gp=gpar(col="black", fontsize=18, fontfamily="Times Roman")))
    
    myplot2 <- arrangeGrob(myplot2, top = textGrob("B", x = unit(0, "npc")
             , y = unit(1, "npc"), just=c("left","top"),
             gp=gpar(col="black", fontsize=18, fontfamily="Times Roman")))
    
    myplot3 <- arrangeGrob(myplot3, top = textGrob("C", x = unit(0, "npc")
            , y  = unit(1, "npc"), just=c("left","top"),
            gp=gpar(col="black", fontsize=18, fontfamily="Times Roman")))
    
    myplot4 <- arrangeGrob(myplot4, top = textGrob("D", x = unit(0, "npc")
            , y = unit(1, "npc"), just=c("left","top"),
            gp=gpar(col="black",    fontsize=18, fontfamily="Times Roman")))
    

    plotting all plots on one page

    grid.arrange(myplot1, myplot2, myplot3, myplot4, ncol = 2)
    

    corner label

    0 讨论(0)
  • 2020-12-29 11:15

    Two recent changes have made this a lot easier:

    • The latest release of ggplot2 has added the tag caption which can be used to label subplots.
    • The package patchwork makes it really easy to plot multiple ggplot objects. https://github.com/thomasp85/patchwork

    This means that no altering of grobs is required. Adapting the reproducible example provided by Kev:

    library(ggplot2)
    # install.package("patchwork")
    library(patchwork)
    
    a <- 1:20
    b <- sample(a, 20)
    c <- sample(b, 20)
    d <- sample(c, 20)
    mydata   <- data.frame(a, b, c, d)
    
    myplot1  <- ggplot(mydata, aes(x=a, y=b)) + geom_point() + labs(tag = "A")
    myplot2  <- ggplot(mydata, aes(x=b, y=c)) + geom_point() + labs(tag = "B")
    myplot3  <- ggplot(mydata, aes(x=c, y=d)) + geom_point() + labs(tag = "C")
    myplot4  <- ggplot(mydata, aes(x=d, y=a)) + geom_point() + labs(tag = "D")
    
    myplot1 + myplot2 + myplot3 + myplot4
    

    0 讨论(0)
  • 2020-12-29 11:20

    Here's a solution using a custom labeller function. This doesn't invovle any manipulations to the data. Currently it only works with 1-dimensional facets (facet_wrap). I'm still working on how to increment along a 2-D grid...

    1. Define the labeller function

      make_labelstring <- function(mypanels) {
        mylabels <- sapply(mypanels, 
                           function(x) {LETTERS[which(mypanels == x)]})
      
        return(mylabels)
      }
      
      label_panels <- ggplot2::as_labeller(make_labelstring)
      
    2. Pass label_panels as the labeller to facet_wrap

      library(ggplot2)
      data("diamonds")
      
      # create a faceted plot
      ggplot(data = diamonds, aes(x = depth, y = price)) +
        geom_point() +
        facet_wrap(~cut, labeller = label_panels) +
        theme(strip.text = element_text(hjust = -0),
              strip.background = element_blank())
      
    0 讨论(0)
  • 2020-12-29 11:31

    An example:

    d <- data.frame(x = runif(16),
                    y = runif(16),
                    grp = rep(letters[1:4],each = 4))
    
    ggplot(d,aes(x = x,y = y)) + 
    facet_wrap(~grp) + 
    geom_point() + 
    theme(strip.text = element_text(hjust = -0.05),
          strip.background = element_blank())
    

    enter image description here

    0 讨论(0)
提交回复
热议问题