【发布时间】:2020-07-01 22:07:17
【问题描述】:
我正在绘制一些需要用 LaTeX 表达式标记的数据,请参阅这个可重现的小示例。我有一个单独的列表,其中包含治疗 1 和治疗 2 的 LaTeX 标签,以避免更改基础数据:
## Required packages
library(tidyverse)
library(latex2exp)
## LaTeX labels
labs <- list(treatment1 = c(unname(TeX("$\\textit{Avo}cado$")), unname(TeX("$Ban_{ana}")) ),
treatment2 = c(unname(TeX("$\\textit{C}at$")), unname(TeX("$D_{og}$")) ) )
## Dummy data frame
df <- data.frame(treatment1 = factor(c(rep("A", 5), rep("B", 5))),
treatment2 = factor(c(rep(c("C", "D"), 5))),
var1 = c(1, 4, 5, 7, 2, 8, 9, 1, 4, 7),
var2 = c(2, 8, 11, 13, 4, 10, 11, 2, 6, 10))
为了将 LaTeX 标签应用到处理 2,颜色变量,我使用 scale_colour_manual() 中的标签参数:
## Scatter plot with colour varying by treatment2
p <- ggplot(df, aes(x = var1, y = var2, colour = treatment2)) +
geom_point() +
scale_colour_manual(values = c("Black", "Blue"),
labels = labs$treatment2)
## Add facet by treatment1
p + facet_grid(treatment1 ~ .)
我尝试在 facet_grid() 中使用 labeller 参数,但这两个选项都会导致错误:
p + facet_grid(treatment1 ~ ., labeller = labs$treatment1)
p + facet_grid(treatment1 ~ ., labeller = label_value(labs$treatment1))
## > Error in cbind(labels = list(), list(`{`, if (!is.null(.rows) || !is.null(.cols)) { :
## number of rows of matrices must match (see arg 2)
在尝试使用 as_labeller() 函数时会加载绘图,但不会更改构面标签:
p + facet_grid(treatment1 ~ ., labeller = as_labeller(labs$treatment1))
我也尝试过手动更改标签(尽管由于我的实际数据框的大小,我更愿意引用一个单独的对象),但没有明显的效果:
p + facet_grid(treatment1 ~ .,
labeller = labeller(treatment1 = c("A" = unname(TeX("$\\textit{Avo}cado$")),
"B" = unname(TeX("$Ban_{ana}")))))
我假设我必须编写一个新的贴标机函数,但我真的不知道从哪里开始。还是我做错了?
【问题讨论】: