如何在ggplot2中的各个方面注释文本

时间:2019-04-24 21:07:11

标签: r ggplot2 facet-grid

此问题是针对以下问题的后续措施:Annotating text on individual facet in ggplot2

我正在尝试接受的答案中提供的代码,并且得到的东西与提供的结果奇怪地不同。授予该职位是较旧的,我正在使用R 3.5.3和ggplot2 3.1.0,但是我得到的似乎没有任何意义。

library(ggplot2)
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p <- p + facet_grid(. ~ cyl)

#below is how the original post created a dataframe for the text annotation
#this will produce an extra facet in the plot for reasons I don't know
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")

这是链接的问题中接受的答案中的代码。对我来说,它会产生以下带有额外构面的图(即,似乎已经向cyl中添加了3的附加分类变量)

https://github.com/RamenZzz/hello-world/blob/master/Rplot09b.jpeg?raw=true

#below is an alternative version that produces the correct plot, that is,
#without any extra facets.
ann_text_alternate <- data.frame(mpg = 15,wt = 5,lab = "Text",cyl = 8)

p+geom_text(data = ann_text_alternate,label = "Text")

这给了我正确的图形:

https://raw.githubusercontent.com/RamenZzz/hello-world/master/Rplot09a.jpeg

有人有什么解释吗?

1 个答案:

答案 0 :(得分:1)

这是一个因素问题。
首先,您以cyl(数据集mtcars中的一列)作为方面。这是类"numeric"的对象,具有3个不同的值。

unique(mtcars$cyl)
#[1] 6 4 8

然后,创建一个新的数据集,即数据帧ann_text。但是您将cyl定义为类"factor"的对象。可以通过str查看此列中的内容。

str(ann_text)
#'data.frame':  1 obs. of  4 variables:
# $ mpg: num 15
# $ wt : num 5
# $ lab: Factor w/ 1 level "Text": 1
# $ cyl: Factor w/ 3 levels "4","6","8": 3

R将因子编码为从1开始的整数,级别"8"是级别编号3
因此,当您将两个数据集组合在一起时,cyl 4 个值,原始编号为468,还有新的数字3。因此,额外的方面。

这也是解决方案起作用的原因,在数据帧ann_text_alternatecyl中,是一个数值变量,采用了一个已经存在的值。

使其生效的另一种方法是强制cyl进行分面时考虑。请注意

levels(factor(mtcars$cyl))
#[1] "4" "6" "8"

新数据帧ann_text不再具有第4级。按照问题开始绘制图形

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p <- p + facet_grid(. ~ factor(cyl))

并添加文字。

p + geom_text(data = ann_text, label = "Text")