如何将表达式传递给ggplot中的geom_text标签?(续)

3

这是我在ggplot中如何将带下标的表达式传递给geom_text标签的原问题的后续。

Duck提供了一个很好的解决方案,使用geom_text()命令内的parse = T。然而,我现在遇到了一个问题,因为我想传递表达式的变量包含其他看起来无法理解的内容,即使使用parse = T也无法解决。

以下是我的当前代码(再次感谢Duck提供了这个解决方案):

library(ggplot2)
library(tidyverse)
#Data
my_exp <- as.character(expression('my_exp'[s][u][b]))

my_data <- 
  data.frame(
    var_1 = c("9R", "14M", "17C"),
    var_2 = c(1, 2, 3),stringsAsFactors = F
  )
#Mutate
my_data$label <- ifelse(my_data$var_1=='9R',my_exp,my_data$var_1)
#Plot
my_data %>%
  ggplot(aes(x = var_1, y = var_2))+
  geom_text(aes(label = label),parse = T)

以下是我尝试渲染ggplot时出现的错误输出:

> library(ggplot2)
> library(tidyverse)
> #Data
> my_exp <- as.character(expression('my_exp'[s][u][b]))
> my_data <- 
+   data.frame(
+     var_1 = c("9R", "14M", "17C"),
+     var_2 = c(1, 2, 3),stringsAsFactors = F
+   )
> #Mutate
> my_data$label <- ifelse(my_data$var_1=='9R',my_exp,my_data$var_1)
> #Plot
> my_data %>%
+   ggplot(aes(x = var_1, y = var_2))+
+   geom_text(aes(label = label),parse = T)
Error in parse(text = text[[i]]) : <text>:1:3: unexpected symbol
1: 14M
      ^
> 

看起来 R 在读取没有传递表达式的单元格时遇到了困难。有没有办法让 R 只解析相关的单元格?

谢谢!

2个回答

2
也许这不是最优解,但您可以为表达式和经典文本分别创建标签。以下是代码示例:

library(ggplot2)
library(tidyverse)
#Data
my_exp <- as.character(expression('my_exp'[s][u][b]))

my_data <- 
  data.frame(
    var_1 = c("9R", "14M", "17C"),
    var_2 = c(1, 2, 3),stringsAsFactors = F
  )
#Mutate label 1
my_data$label <- ifelse(my_data$var_1=='9R',my_exp,NA)
my_data$label2 <- ifelse(my_data$var_1=='9R',NA,my_data$var_1)
#Plot
my_data %>%
  ggplot(aes(x = var_1, y = var_2))+
  geom_text(aes(label = label),parse = T)+
  geom_text(aes(label = label2))

输出:

在这里输入图片描述

使用geom_text()两次可以修改绘图。


2
作为替代方案,您可以使用 ggtext 包中的 geom_richtext() 函数,并使用 ...... 创建上标或下标。
library(ggplot2)
library(ggtext)

#Data
my_exp <- "my_exp<sub>sub</sub>"

my_data <- 
  data.frame(
    var_1 = c("9R", "14M", "17C"),
    var_2 = c(1, 2, 3), stringsAsFactors = F
  )
#Mutate
my_data$label <- ifelse(my_data$var_1=='9R', my_exp, my_data$var_1)
#Plot
ggplot(my_data, aes(x = var_1, y = var_2)) +
  geom_richtext(
    aes(label = label),
    # customization to remove background and border around labels
    fill = NA,
    label.colour = NA
  )

创建于2020年9月9日,使用reprex package(v0.3.0)生成。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接