R 在多面板ggplot2中为单个面板添加标签

R 在多面板ggplot2中为单个面板添加标签,r,ggplot2,label,panel,R,Ggplot2,Label,Panel,我对尝试为我正在ggplot中准备的多面板图形创建简单的角点标签感兴趣,但答案只是解释了如何在绘图顶部添加标签,而不是按照许多期刊要求的格式生成角标签。我希望复制类似于ggplot2中的plotrix函数corner.label() 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

我对尝试为我正在ggplot中准备的多面板图形创建简单的角点标签感兴趣,但答案只是解释了如何在绘图顶部添加标签,而不是按照许多期刊要求的格式生成角标签。我希望复制类似于
ggplot2
中的
plotrix
函数
corner.label()

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)
下面是一个使用
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)
require(plotrix)
foo1一个例子:

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

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

加载r包 示例数据

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

  • 定义labeller函数

    make_labelstring <- function(mypanels) {
      mylabels <- sapply(mypanels, 
                         function(x) {LETTERS[which(mypanels == x)]})
    
      return(mylabels)
    }
    
    label_panels <- ggplot2::as_labeller(make_labelstring)
    

  • 最近的两项变化使这一点变得容易得多:

    • 最新版本的
      ggplot2
      添加了
      tag
      标题,可用于标记子批次
    • 软件包
      patchwork
      使绘制多个ggplot对象变得非常容易
    这意味着不需要更改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主题的更多信息,请参阅。

    您能否澄清标签的确切外观?您是否需要将刻面标签全部推到左侧?或者您需要完全移除刻面标签带吗?我只需要将标签对齐到每个面板的左上角。我不知道你删除刻面标签条带是什么意思。好的,然后查看
    ?主题
    ,并为
    条带设置hjust.text
    。有没有办法让标签位于绘图/轴区域之外?与corner.label()中的“figcorner=T”选项类似?@Thraupidae您可以将
    hjust
    设置为负值,但随后b和d将漂移到其他面板中。@Thraupidae请参见我的编辑。我想这更接近你想要的。(并且应该解释为什么我要问小面带。)好的,为了防止漂移到其他面板上,我想你只需要使用plot.margin来处理间距问题?啊,是的,这看起来非常接近我希望去除小面带的效果。谢谢这太棒了。这比IMO公认的解决方案更简单、更普遍适用、更易于实施。谢谢!您能将
    标签
    改为粗体、更改大小等吗。?如何做到这一点?好问题:在原始答案的基础上添加更多内容以涵盖您的观点。ggplot2的几乎每个组件都可以通过
    主题
    参数进行定制。谢谢!我试图找到文档,但似乎没有很多人使用它!
    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)
    
    make_labelstring <- function(mypanels) {
      mylabels <- sapply(mypanels, 
                         function(x) {LETTERS[which(mypanels == x)]})
    
      return(mylabels)
    }
    
    label_panels <- ggplot2::as_labeller(make_labelstring)
    
    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())
    
    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"))