如何在ggplot中将表达式传递给geom_text标签? 继续

问题描述

这是我的original question的后续工作,内容涉及如何将带下标的表达式传递到ggplot中的geom_text标签

Duckparse = T命令中使用geom_text()提供了很好的解决方案。但是,我现在遇到了一个问题,因为我希望将一个表达式传递给该变量以包含其他内容,这些内容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",+     var_2 = c(1,stringsAsFactors = F
+   )
> #Mutate
> my_data$label <- ifelse(my_data$var_1=='9R',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仅解析相关单元格?

谢谢!

解决方法

也许这不是最佳选择,但是您可以为表达式创建一个标签,为经典文本创建另一个标签。这里的代码:

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))

输出:

enter image description here

使用两次geom_text()可以破解剧情。

,

或者,您可以使用ggtext包中的geom_richtext()并使用<sup>...</sup><sub>...</sub>创建上标或下标。

library(ggplot2)
library(ggtext)

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

my_data <- 
  data.frame(
    var_1 = c("9R",stringsAsFactors = F
  )
#Mutate
my_data$label <- ifelse(my_data$var_1=='9R',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
  )

reprex package(v0.3.0)于2020-09-09创建