在 ggplot 2 2.0 中向 facet labeller 添加表达式

nou*_*use 7 r ggplot2

我需要用复杂的表达式替换一个 facet wrap 标签。但是,我无法再使用函数facet_wrap_labeller处理在较旧的 ggplot2 版本下创建的绘图。

        data <- as.data.frame(matrix(rnorm(60),20,3)) 
        data$factor <- c(rep("f1", 4),rep("f2", 4), rep("f3", 4), rep("f4",4),rep("f5", 4))
        names(data) <- c("A", "B", "C", "factor")
        melted <- melt(data)

        p <- ggplot(melted, aes(variable, value)) +
             stat_boxplot(geom ='errorbar') + 
             geom_boxplot()
        p1 <- p + facet_wrap(~factor)
        facet_wrap_labeller(p1, labels=c("A", "B", expression({}^2*italic(D)~textstyle(group("(", rarefied, ")")))))
Run Code Online (Sandbox Code Playgroud)

我得到:

Error in getGrob(gg[[strips[ii]]], "strip.text", grep = TRUE, global = TRUE) : 
  it is only valid to get a child from a "gTree"
Called from: getGrob(gg[[strips[ii]]], "strip.text", grep = TRUE, global = TRUE)
Run Code Online (Sandbox Code Playgroud)

我相信这是因为 ggplot2 2.0 与此功能不兼容。

我也尝试过labeller=labeller(), 和labeller=bquote()参数,但是当我尝试使用这个向量时

newlabels <- c(A="A", B="B",,
    D=expression({}^0*italic(D)~textstyle(group("(", rarefied, ")"))))
Run Code Online (Sandbox Code Playgroud)

p1 <- p + facet_wrap(~factor, 
           labeller = labeller(factor=newlabels))
Run Code Online (Sandbox Code Playgroud)

忽略表达式并绘制原始因子水平。使用 bquote,我不知道在参数中添加多个名称。

任何帮助表示赞赏。

pic*_*ick 9

在您的示例中,5 个方面似乎只有 4 个标签,但您可以labeller=label_parsed相当轻松地使用和重命名因子级别,从而避免使用其他函数。

## Rename levels (I used data.table::melt, so they were characters)
melted$factor <- factor(melted$factor, 
                        levels=paste0('f', 1:5),
                        labels=c('A', 'B', 'C', '{}^0*italic(D)~plain((rarefied))', 'E'))

p <- ggplot(melted, aes(variable, value)) +
  stat_boxplot(geom ='errorbar') + 
  geom_boxplot()
p + facet_wrap(~factor, labeller=label_parsed)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明