ggtext的geom_richtext可以使用Markdown或者html语法来拓展ggplot2的文字图层geom_label用法。最近在使用ggtext时,有一个需要geom_text的效果的需求,但是ggtext的图层效果都是类似于geom_label的,要想使用geom_text效果可以通过参数设置来实现。geom_label和geom_text的视觉区别在于是否有一个边框区域。
以iris数据为例,一个简单的注释文本如下图所示,它有两个不符合刚才所述的需求的地方:
library(tidyverse)
iris %>% ggplot(aes(x = Sepal.Length,
y = Sepal.Width,
color = Species)) +
geom_boxplot() +
ggtext::geom_richtext(aes(x = 6, y = 4,
label = 'test text',
)
)

要去除一个图层的legend信息只需要设置图层的show.legend选项即可。
library(tidyverse)
iris %>% ggplot(aes(x = Sepal.Length,
y = Sepal.Width,
color = Species)) +
geom_boxplot() +
ggtext::geom_richtext(aes(x = 6, y = 4,
label = 'test text',
),
show.legend = FALSE
)

geom_text风格需要调整三个地方:label边框去除、label底色去除、文本颜色调整。
这三个参数分别由label.colour、 fill、color控制。
fill、color还可以映射变量,和普通的ggplot2的geom_label类似,如果需要可以在aes函数中定义它。但是如果是映射的常量,则需要在aes函数外定义。
iris %>% ggplot(aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
geom_boxplot() +
ggtext::geom_richtext(aes(x = 6, y = 4,
label = 'test text',
),
color = 'black',
label.colour = NA,
fill = NA,
show.legend = FALSE
)

上面均是测试的'test text',但是这体现不出geom_text的功用,以一个较为复杂的label为例:注释文本分为两行,第一行为红色字体,第二行以空格开头,并使用上下标标签。
iris %>% ggplot(aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
geom_boxplot() +
ggtext::geom_richtext(aes(x = 6, y = 4,
label ='<p style = "color:red;">first line</p>\n<span> </span> R^2 r<sub>1</sub>',
),
color = 'black',
label.colour = NA,
fill = NA,
show.legend = FALSE
)

这里的上标使用的^字符,也可以html的sup标签。
至于上面的例子中特地提到换行和空格,是因为他们配合R中的无穷量Inf,可以实现一个相对优雅的固定排版布局。
比如我们想实现一个label在右上角的布局,那么就可以设置x和y均是Inf,则label会出现在x和y的最大值处,在图中也就是右上角的位置,再通过hjust和vjust控制此label的中心点,即可实现注释文本永远在右上角对齐的效果,这种稳健的写法非常适合自己需要写工具函数的时候。PS:为了显示label的大小,注释文本添加了一个蓝色的边框。
iris %>% ggplot(aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
geom_boxplot() +
ggtext::geom_richtext(aes(x = Inf, y = Inf,
label ='<p style = "color:red;">first line</p>\n<span> </span> R^2 r<sub>1</sub>',
),
hjust = 1,
vjust = 1,
color = 'black',
label.colour = 'blue',
fill = NA,
show.legend = FALSE
)

如果label距边框远一些,也许效果会更好,通过换行和空格可以实现,也就是下图。
换行可以通过多种形式实现:br标签,空的p标签以及\n标识,空格可以通过正常的空格、 字符以及空的span标签,如果一种效果不好就尝试另一种。
iris %>% ggplot(aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
geom_boxplot() +
ggtext::geom_richtext(aes(x = Inf, y = Inf,
label ='<p></p><p style = "color:red;">first line<span> </span></p> \n<span> </span> R^2 r<sub>1</sub>',
),
hjust = 1,
vjust = 1,
color = 'black',
label.colour = 'blue',
fill = NA,
show.legend = FALSE
)

PS:推文都写完了才发现,这个boxplot画错了,一般情况下boxplot不会是x y双连续变量的,所以正常情况下的画法类似于下图,不过不影响本文的内容。
iris %>% ggplot(aes(x = Species, y = Sepal.Width, color = Species)) +
geom_boxplot()
