R语言 为将用作ggplot标签的字符向量添加下标

r3i60tvu  于 2023-03-15  发布在  其他
关注(0)|答案(2)|浏览(213)

我看到了很多将下标和上标添加到绘图标签的示例,但我很好奇如何将下标添加到最终可用于绘图的字符向量。
示例数据和图:

data.frame(site = LETTERS[1:10],
            a1 = c(rep(1, 7), rep(NA, 3)),
            a2 = c(rep(NA, 4), rep(2, 6)),
            minY = sample(1:9, 10, replace = TRUE),
            maxY = sample(10:19, 10, replace = TRUE)) %>% 
 mutate(label = case_when(is.na(a1) ~ paste(site, a2, sep = ""), 
                          is.na(a2) ~ paste(site, a1, sep = ""), 
                          TRUE ~ paste(site, paste(a1, a2, sep = ","), sep = ""))) %>% 
 ggplot() +
 geom_segment(aes(x = label, xend = label, y = minY, yend = maxY))

我怎样才能把1和2变成图的下标呢?

ybzsozfc

ybzsozfc1#

以编程方式形成表达式/bquote字符串(例如A[2]),然后使用scales::label_parse()
注意,对于R的plotmath(这是内部实现的方式),我们需要明确逗号分隔的下标,当一个数字有一个A[1]的“表达式”(符号)时,我们不能使用A[1,2],因为,2将从视图中删除;相反,我们需要A[1*','*2],即数字1后跟(在数学语法中为乘法)字符串逗号,然后是数字2。

data.frame(site = LETTERS[1:10],
            a1 = c(rep(1, 7), rep(NA, 3)),
            a2 = c(rep(NA, 4), rep(2, 6)),
            minY = sample(1:9, 10, replace = TRUE),
            maxY = sample(10:19, 10, replace = TRUE)) %>% 
  mutate(
     label = sprintf("%s[%s]", site,             # CHANGED
       mapply(function(x, y) paste(na.omit(c(x, y)), collapse = "*','*"), a1, a2))
  ) %>%
  ggplot() +
    geom_segment(aes(x = label, xend = label, y = minY, yend = maxY)) +
    scale_x_discrete(labels = scales::label_parse()) # NEW

注意:这几乎是How to use subscripts in ggplot2 legends [R]等几个问题的重复,尽管我找不到非常正确的措辞来解决 * 这个 * 问题。

mccptt67

mccptt672#

我们将标签转换为乳胶并在其上使用TeX。DF是问题中定义的 Dataframe ,也显示在结尾的注解中。

library(dplyr)
library(ggplot2)
library(latex2exp)

DF %>% 
  ggplot() +
  geom_segment(aes(x = label, xend = label, y = minY, yend = maxY)) +
  scale_x_discrete(labels = ~ TeX(sub("(.)([0-9,]+)", "$\\1_{\\2}$", .x)))

注解

这与问题中的内容相同,只是我们将其分离出来并命名为DF

DF <- data.frame(site = LETTERS[1:10],
            a1 = c(rep(1, 7), rep(NA, 3)),
            a2 = c(rep(NA, 4), rep(2, 6)),
            minY = sample(1:9, 10, replace = TRUE),
            maxY = sample(10:19, 10, replace = TRUE)) %>% 
 mutate(label = case_when(is.na(a1) ~ paste(site, a2, sep = ""), 
                          is.na(a2) ~ paste(site, a1, sep = ""), 
                          TRUE ~ paste(site, paste(a1, a2, sep = ","), sep = "")))

相关问题