能否使用ggtext实现符号上下叠加绘制?
问题描述
尝试使用ggtext包的geom_richtext创建标签,希望将数字与字母上下叠加显示,但不确定ggtext是否支持该功能。目前仅能通过expression、atop和paste的复杂组合实现预期布局,但更倾向于使用HTML方案,请问有什么思路吗?
现有尝试方案1:使用ggtext的HTML标签
library(tibble) library(ggplot2) library(ggtext) dummy <- tibble(this = "A", that = 1) my_label1 <- "*p* = 0.05<br>ω<sub>*p*</sub><sup>2</sup>: large" dummy %>% ggplot(., aes(this, that)) + theme_void() + geom_richtext( aes(0, 0, label = my_label1), size = 10, label.colour = "grey", hjust = 0 ) #> Warning in text_info(label, fontkey, fontfamily, font, fontsize, cache): unable #> to translate '<U+03C9>png128.4527559055118' to native encoding #> Warning in text_info_cache[[key]] <- info: unable to translate #> '<U+03C9>png128.4527559055118' to native encoding

现有尝试方案2:使用expression+atop
my_label2 <- expression(atop(paste(italic("p")," = 0.05 "), paste(omega [italic("p")] ^"2", ": large"))) dummy %>% ggplot(., aes(this, that)) + theme_void() + geom_label( aes(0, 0), label = my_label2, parse = T, size = 10 ) #> Warning in is.na(x): is.na() auf Nicht-(Liste oder Vektor) des Typs 'expression' #> angewendet

Created on 2022-11-17 with reprex v2.0.2
解决方案
ggtext支持通过HTML结合CSS布局实现上下叠加的标签效果,完全可以替代expression+atop的复杂写法,具体实现思路如下:
- 替换HTML实体为Unicode字符:用直接的Unicode希腊字母(比如
ω)代替ω,解决编码警告问题; - 利用HTML标签控制换行与对齐:用
<br>实现基础换行,或用<div>配合text-align样式精准控制两行的对齐方式(左对齐、居中、右对齐); - 优化文本框样式:通过
geom_richtext的参数调整文本框的填充、圆角等,让布局更紧凑美观。
优化后的代码示例
library(tibble) library(ggplot2) library(ggtext) dummy <- tibble(this = "A", that = 1) # 使用HTML+CSS构建标签,左对齐两行内容 my_label_html <- '<div style="text-align: left;"> <span>*p* = 0.05</span><br> <span>*ω*<sub>*p*</sub><sup>2</sup>: large</span> </div>' dummy %>% ggplot(aes(this, that)) + theme_void() + geom_richtext( aes(0, 0, label = my_label_html), size = 10, label.colour = "grey", hjust = 0, fill = NA, # 去掉背景填充 label.padding = unit(0, "lines") # 去掉内边距,让布局更紧凑 )
这种HTML方案比expression写法更直观,也更容易扩展复杂格式(比如不同颜色、字体大小),完全满足上下叠加的布局需求。
内容的提问来源于stack exchange,提问作者maRvin
相关产品推荐
相关产品推荐

