问题描述
这是我的original question的后续工作,内容涉及如何将带下标的表达式传递到ggplot中的geom_text标签。
Duck在parse = T
命令中使用geom_text()
提供了很好的解决方案。但是,我现在遇到了一个问题,因为我希望将一个表达式传递给该变量以包含其他内容,这些内容用parse = T
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)
> 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))
输出:
使用两次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创建