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

MYa*_*208 126 r ggplot2

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

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

jor*_*ran 128

通常你会做这样的事情:

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")
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

  • 谢谢你的解决方案.我想知道我是否也可以使用`annotate()`来做到这一点? (7认同)
  • @Margaret通常,那是因为你错误地告诉ggplot为原始数据框中的每一行(带有点,线等的那一行)绘制每个标签的副本.请注意,我将一个单独的数据框传递给只有一行的`geom_text`. (6认同)
  • 好的,我得到了 - 谢谢.如果您想在刻面图上放置3个不同的标签,该怎么办?我尝试了一个数据帧,其行数与我的方面一样多,每行中都有唯一的标签.也许我应该把它作为一个单独的问题开始. (3认同)
  • 当我尝试在我的刻面图上使用geom_text()时,我似乎遇到了一些模糊的标签.这是与此处讨论的相同问题(https://groups.google.com/forum/?fromgroups=#!topic/ggplot2/evsbeBT48M4),并通过使用注释("text",...)解决.有没有其他人使用geom_text()获得模糊标签? (2认同)
  • @ user3420448同样,您只需为每个分面变量指定值. (2认同)
  • 如果想实际使用“lab”列中的值,可以改为“geom_text(data = ann_text, aes(label = lab))”。 (2认同)

Kam*_*ski 84

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

library(ggplot2)

p <- ggplot(mtcars, aes(mpg, wt)) +
  geom_point() +
  facet_grid(. ~ cyl) +
  theme(panel.spacing = unit(1, "lines"))
p
Run Code Online (Sandbox Code Playgroud)

没有文字注释的情节

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

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
)
Run Code Online (Sandbox Code Playgroud)

在边缘处使用文本注释绘图

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

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)
)
Run Code Online (Sandbox Code Playgroud)

用手动定位的文本标签绘图

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

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
  )
Run Code Online (Sandbox Code Playgroud)

由两个变量构成

笔记:

  • 您可以使用-InfInf在面板边缘定位文本.
  • 您可以使用hjustvjust调整文本对齐方式.
  • 文本标签数据框dat_text应该有一个与您的facet_grid()或与之一起使用的列facet_wrap().

  • 这个答案优于已接受的答案(显然是两者之间的5年差异),因为它逐步完成每个步骤.更清晰和解释. (4认同)

Tun*_*ung 24

如果有人正在寻找一种简单的方法来标记报表或出版物的方面,则该egg软件包的开发版本具有tag_facet()功能

library(ggplot2)

p <- ggplot(mtcars, aes(qsec, mpg)) + 
  geom_point() + 
  facet_grid(. ~ am) +
  theme_bw(base_size = 12)

# install.packages('egg', dependencies = TRUE)
library(egg)
Run Code Online (Sandbox Code Playgroud)

# Default
tag_facet(p)
Run Code Online (Sandbox Code Playgroud)

# align top right & use Roman numerals
tag_facet(p, x = Inf, y = Inf, 
          hjust = 1.5,
          tag_pool = as.roman(1:nlevels(factor(mtcars$am))))
Run Code Online (Sandbox Code Playgroud)

  • 消息来源说“向 ggplot 添加一个虚拟文本层来标记构面,并将构面条设置为空白。”因此,如果您有不想丢失的自定义构面标签条,请通过取消“strip”来编辑“tag_facet”的脚本.text = element_blank()` (3认同)

小智 21

我认为对于上面的答案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" )
Run Code Online (Sandbox Code Playgroud)

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

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) )
Run Code Online (Sandbox Code Playgroud)

  • 您应该深入解释您的解决方案与已经给出和接受的答案相比所提供的内容. (6认同)
  • 谢谢,这对标记不同的子图很有用. (2认同)

Joh*_*ohn 10

稍微扩展 joran 的出色答案,以阐明标签数据框的工作原理。

您可以将“mpg”和“wt”分别视为 x 和 y 坐标(我发现跟踪原始变量名称比重命名它们更容易,如 Kamil 的出色答案)。每个标签需要一行,“cyl”列显示每行与哪个方面相关联。

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)
Run Code Online (Sandbox Code Playgroud)

带标签的绘图