【问题标题】:Replace strip labels with list of values用值列表替换条形标签
【发布时间】: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}")))))

我假设我必须编写一个新的贴标机函数,但我真的不知道从哪里开始。还是我做错了?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    这行得通:

    flabels <- function(level){
      labels <- c(
        A = unname(TeX("$\\textit{Avo}cado$")), 
        B = unname(TeX("$Ban_{ana}"))
      )
      labels[level]
    }
    
    p <- ggplot(df, aes(x = var1, y = var2, colour = treatment2)) +
      geom_point() 
    p + facet_grid(treatment1 ~ ., 
                   labeller = labeller(treatment1 = as_labeller(flabels, default = label_parsed)))
    

    【讨论】:

    • 这太棒了,谢谢 - 如果原始因子名称中有空格,有没有办法使函数工作?或者是否有必要重新编码这些因素?
    • @LucyWheeler 你的意思是关卡名称中的空格(这里是"A""B")?
    • 是的,例如,如果它们在数据框中是 "A E""B F"
    • @LucyWheeler 你可以做c("A E" = unname(......), "B F" = ......)
    猜你喜欢
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多