首页 文章

在ggplot2中对单个构面上的文本进行注释

提问于
浏览
108

我想用以下代码在图的最后一个面上注释一些文本:

library(ggplot2)
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p <- p + facet_grid(. ~ cyl)
p <- p + annotate("text", label = "Test", size = 4, x = 15, y = 5)
print(p)

enter image description here

但是这段代码注释了每个方面的文本 . 如果您指导我如何仅在一个方面获得带注释的文本,我将非常感激 . 提前致谢 .

5 回答

  • 115

    通常你会做这样的事情:

    ann_text <- data.frame(mpg = 15,wt = 5,lab = "Text",
                           cyl = factor(8,levels = c("4","6","8")))
    p + geom_text(data = ann_text,label = "Text")
    

    它应该工作而不完全指定因子变量,但可能会抛出一些警告:

    enter image description here

  • 1

    这是没有文字注释的情节:

    library(ggplot2)
    
    p <- ggplot(mtcars, aes(mpg, wt)) +
      geom_point() +
      facet_grid(. ~ cyl) +
      theme(panel.spacing = unit(1, "lines"))
    p
    

    plot without text annotations

    让我们创建一个额外的数据框来保存文本注释:

    dat_text <- data.frame(
      label = c("4 cylinders", "6 cylinders", "8 cylinders"),
      cyl   = c(4, 6, 8)
    )
    p + geom_text(
      data    = dat_text,
      mapping = aes(x = -Inf, y = -Inf, label = label),
      hjust   = -0.1,
      vjust   = -1
    )
    

    plot with text annotations at edges

    或者,我们可以手动指定每个标签的位置:

    dat_text <- data.frame(
      label = c("4 cylinders", "6 cylinders", "8 cylinders"),
      cyl   = c(4, 6, 8),
      x     = c(20, 27.5, 25),
      y     = c(4, 4, 4.5)
    )
    
    p + geom_text(
      data    = dat_text,
      mapping = aes(x = x, y = y, label = label)
    )
    

    plot with manually positioned text labels

    我们还可以在两个方面标记图:

    dat_text <- data.frame(
      cyl   = c(4, 6, 8, 4, 6, 8),
      am    = c(0, 0, 0, 1, 1, 1)
    )
    dat_text$label <- sprintf(
      "%s, %s cylinders",
      ifelse(dat_text$am == 0, "automatic", "manual"),
      dat_text$cyl
    )
    p +
      facet_grid(am ~ cyl) +
      geom_text(
        size    = 5,
        data    = dat_text,
        mapping = aes(x = Inf, y = Inf, label = label),
        hjust   = 1.05,
        vjust   = 1.5
      )
    

    facet by two variables

    笔记:

    • 您可以使用 -InfInf 在面板边缘定位文本 .

    • 您可以使用 hjustvjust 来调整文本对齐方式 .

    • 文本标签数据框 dat_text 应该有一个适用于 facet_grid()facet_wrap() 的列 .

  • 67

    我认为对于上面的答案lab =“Text”是没用的,下面的代码也没问题 .

    ann_text <- data.frame(mpg = 15,wt = 5,
                           cyl = factor(8,levels = c("4","6","8")))
    p + geom_text(data = ann_text,label = "Text" )
    

    但是,如果要在不同的子图中标记不同,则可以通过以下方式进行标记:

    ann_text <- data.frame(mpg = c(14,15),wt = c(4,5),lab=c("text1","text2"),
                           cyl = factor(c(6,8),levels = c("4","6","8")))
    p + geom_text(data = ann_text,aes(label =lab) )
    
  • 21

    如果有人正在寻找一种简单的方法来标记报表或出版物的方面,egg包有一个非常漂亮的 tag_facet() 函数

    library(ggplot2)
    
    p <- ggplot(mtcars, aes(mpg, wt)) + 
      geom_point() + 
      facet_grid(. ~ cyl) +
      theme_bw(base_size = 12)
    
    ### CRAN: install.packages('egg', dependencies = TRUE)
    ### GitHub: devtools::install_github("baptiste/egg")
    library(egg)
    
    # default
    tag_facet(p)
    

    # align top right & use Roman numerals
    tag_facet(p, x = Inf, y = Inf, 
              hjust = 1.5,
              tag_pool = as.roman(1:length(unique(mtcars$cyl))))
    

    # align bottom left & use capital letters
    tag_facet(p, 
              x = -Inf, y = -Inf, 
              vjust = -1,
              open = "", close = ")",
              tag_pool = LETTERS
              )
    

    # define your own tags
    my_tag <- c("i) 4 cylinders", "ii) 6 cyls", "iii) 8 cylo")
    tag_facet(p, 
              x = -Inf, y = -Inf, 
              vjust = -1, hjust = -0.25,
              open = "", close = "",
              fontface = 4,
              size = 5,
              family = "serif",
              tag_pool = my_tag
    )
    

    由reprex包创建(v0.2.1.9000)

  • 12

    稍微扩展了joran的优秀答案,以阐明标签数据框架的工作原理 .

    您可以将“mpg”和“wt”分别视为x和y坐标(我发现跟踪原始变量名称比重命名它们更容易,就像在Kamil的优秀答案中一样) . 每个标签需要一行,“cyl”列显示每行与哪个facet相关联 .

    ann_text<-data.frame(mpg=c(25,15),wt=c(3,5),cyl=c(6,8),label=c("Label 1","Label 2"))
    
    ann_text
    >  mpg wt cyl  label
    >  25  3   6   Label 1
    >  15  5   8   Label 2
    
    p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
    p <- p + facet_grid(. ~ factor(cyl))
    p + geom_text(data = ann_text,label=ann_text$label)
    

    plot with labels

相关问题