ggplot2新版labeller API下使用bquote的正确实现方案
ggplot2新版labeller API实现自定义表达式标签方案
问题说明
直接将包含bquote生成的表达式的命名向量传入labeller()无法正确渲染plotmath格式,旧版接收variable和value双参数的labeller函数已被废弃,运行会触发警告。
可用解决方案
方案1:使用plotmath字符 + label_parsed(推荐,写法更简洁)
你可以直接将标签写为符合plotmath语法的字符,配合as_labeller()和label_parsed解析器实现格式渲染,完整代码如下:
library(ggplot2) data(Orange) Orange$tree2 <- paste0("T", Orange$Tree) # 构造plotmath格式的命名字符向量,空格用~代替 tree_lab <- c( T1 = "Tree~1[test]", T2 = "Tree~2", T3 = "Tree~3", T4 = "Tree~4", T5 = "Tree~5" ) ggplot(Orange, aes(x = age, y = circumference)) + facet_wrap(~tree2, labeller = labeller( tree2 = as_labeller(tree_lab, default = label_parsed) )) + geom_point()
方案2:保留bquote写法,自定义符合新版API的labeller函数
新版labeller API要求自定义函数仅接收一个参数:存储分面变量取值的单列数据框,返回对应的标签向量即可,完整代码如下:
library(ggplot2) data(Orange) Orange$tree2 <- paste0("T", Orange$Tree) tree.lab <- c( T1 = bquote("Tree 1"[test]), T2 = "Tree 2", T3 = "Tree 3", T4 = "Tree 4", T5 = "Tree 5" ) # 符合新版规范的自定义labeller函数 custom_expr_labeller <- function(labels) { # 取分面变量的取值匹配命名向量,返回对应的表达式 unname(tree.lab[as.character(labels[[1]])]) } ggplot(Orange, aes(x = age, y = circumference)) + facet_wrap(~tree2, labeller = custom_expr_labeller) + geom_point()
原代码问题原因
直接将包含表达式的命名向量传入labeller()时,默认会将表达式转为普通字符串,不会触发plotmath渲染,因此下标等格式无法正常显示。
内容的提问来源于stack exchange,提问作者user2165907
相关产品推荐
相关产品推荐

