13

我有兴趣尝试为我在 ggplot 中准备的多面板图形创建简单的角标签。这与之前提出的问题类似,但答案仅说明了如何在图表顶部包含标签,而不是按照许多期刊要求的格式生成角落标签。我希望plotrix复制类似于corner.label().ggplot2

这是一个使用plottrix我想在ggplot2.

require(plotrix)

foo1<-rnorm(50,25,5)
foo2<-rpois(50,25)
foo3<-rbinom(50,25,0.5)
foo4<-rnbinom(50,25,0.5)

par(mfrow=c(2,2))
hist(foo1)
corner.label(label='a',figcorner=T)
hist(foo2)
corner.label(label='b',figcorner=T)
hist(foo3)
corner.label(label='c',figcorner=T)
hist(foo4)
corner.label(label='d',figcorner=T)

这会产生以下结果:

在此处输入图像描述

提前感谢您的帮助!

4

4 回答 4

17

最近的两项更改使这变得容易多了:

这意味着不需要更改 grobs。改编 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

在此处输入图像描述

扩展:改变风格:

如果要更改标签样式,可以为每个图单独设置或设置主题默认值。我会推荐第二种方法。在构建绘图之前添加以下行以使字体变为粗体蓝色

ggplot2::theme_update(plot.tag = element_text(face = "bold", colour = "blue"))

有关自定义 ggplot2 主题的更多信息,请参见此处

于 2018-07-15T23:12:52.367 回答
13

我遇到了同样的问题,并提出了以下解决方案,这有点不同:

加载 r 包

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

示例数据

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

设置角标签

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

在一页上绘制所有图

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

角标

于 2015-04-25T09:03:09.873 回答
6

一个例子:

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

在此处输入图像描述

于 2013-07-10T16:56:08.280 回答
1

这是使用自定义贴标机功能的解决方案。这不涉及对数据的任何操作。目前它仅适用于一维构面(facet_wrap)。我仍在研究如何沿二维网格递增...

  1. 定义贴标机功能

    make_labelstring <- function(mypanels) {
      mylabels <- sapply(mypanels, 
                         function(x) {LETTERS[which(mypanels == x)]})
    
      return(mylabels)
    }
    
    label_panels <- ggplot2::as_labeller(make_labelstring)
    
  2. label_panels作为贴标机传递给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())
    
于 2016-10-06T15:59:01.560 回答