Corner Labels in ggplot2

故事扮演 提交于 2019-12-03 07:54:47

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)

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. It is currently in development but expect it to be on CRAN soon as it is awesome: https://github.com/thomasp85/patchwork

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

library(ggplot2)
# devtools::install_github("thomasp85/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

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

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())
    
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!