在R中创建用于绘图的表达式列/向量的方法求助
解决方案
要生成x在上、y在下的双行标签(用于绘图),核心是保留atop()表达式的结构,以下是两种可行方法:
方法1:在数据框中生成表达式列表列
直接用map2逐行生成atop表达式,存储为列表列,绘图时直接调用:
library(tidyverse) # 示例数据 test <- data.frame(x = c("BG10", "C1456", "DXT6"), y = c("293S", "124F", "124F")) # 生成表达式列表列 test <- test %>% mutate(label_expr = map2(x, y, ~bquote(atop(.(.x), .(.y))))) # 绘图示例(以ggplot2为例) ggplot(test, aes(x = seq(nrow(test)), y = 1)) + geom_text(aes(label = label_expr), parse = TRUE, size = 5) + scale_x_continuous(breaks = seq(nrow(test)), labels = test$label_expr) + theme(axis.text.x = element_text(size = 12))
方法2:生成表达式向量(而非列表)
如果需要将标签转为表达式向量(方便后续作为因子标签或刻度标签),可以用do.call(expression, .)把列表转为表达式向量:
# 生成表达式向量 label_exprs <- test %>% pmap(function(x, y, ...) bquote(atop(.(x), .(y)))) %>% do.call(expression, .) # 查看结果 label_exprs #> expression(atop("BG10", "293S"), atop("C1456", "124F"), atop("DXT6", "124F")) # 作为因子标签的示例 test$group <- factor(test$y, labels = label_exprs[1:2]) # 注意对应关系
为什么之前的方法出错?
- 直接在
mutate中使用bquote(atop(.(x), .(y))):bquote无法自动循环处理向量,会因向量长度不匹配报错。 - 用
unlist转换表达式列表:unlist会将表达式强制转为字符类型,丢失atop的表达式结构,导致绘图时无法解析为双行标签。
内容的提问来源于stack exchange,提问作者vizidea
相关产品推荐
相关产品推荐

