使用 "expression" 创建带有一些斜体的标签列表,使用数据框中的值

Using "expression" to create list of labels with some italics, using values from a dataframe

我正在尝试创建包含斜体的标签列表。我可以用这样的“表达式”来做到这一点,当我把它们放在一个图上时(通过添加一个图例作为例子,但我会以不同的方式使用它们),一切都很好。

sp.names=c(expression(paste("species ",italic("one")," sp.")),
           expression(paste("species ",italic("two")," sp.")))
plot(1:10)
legend("topleft",legend=sp.names)

但我不想直接在代码中指定标签中的单词,而是想从数据框中的单元格中调用它们(因为它们有很多,并且它们会根据我的基础数据而变化)。但是当我尝试指定我想要的数据框单元格时,它没有正确打印标签(见下文)。也许我可以用不同的方式来调用我希望“表达式”函数能够识别的单元格?

df=data.frame(V1=c("species","species","species"),V2=c("one","two","three"))
sp.names=c(expression(paste(df$V1[1],italic(df$V2[1])," sp.")),
           expression(paste(df$V1[2],italic(df$V2[2])," sp.")))
plot(1:10)
legend("topleft",legend=sp.names)

使用substitute,它替换表达式中的变量。

sp.names=c(substitute(V1 ~ italic(V2) ~ "sp.", df[1,]),
           substitute(V1 ~ italic(V2) ~ "sp.", df[2,]))

我还删除了不需要的 paste(在 plotmath 中具有不同的含义)并将其替换为 ~ 以提高可读性。

试一试bquote

sp.names <- c(bquote(.(df$V1[1])~italic(.(df$V2[1]))~" sp."),
              bquote(.(df$V1[2])~italic(.(df$V2[2]))~" sp."))

plot(1:10)
legend("topleft", legend=sp.names)