【问题标题】:R - Interpreting a subscript in a variable used in ggplotR - 解释 ggplot 中使用的变量中的下标
【发布时间】:2015-07-11 18:23:40
【问题描述】:

我正在使用 ggplot 绘制一些由大量变量和粘贴构成的多线图。我一直无法弄清楚如何让 O3 中的下标 3 出现在以下简化版本的代码中。

gasSubscript <- "O[3]"
color1 <- paste(gasSubscript,"some additional text")
df <- data.frame(x = c(1,2,3,4,5,6,7,8,9,10), y = c(10,9,8,7,6,5,4,3,2,1))
testPlot <- ggplot(data = df, aes(x = x)) + geom_line(aes(y = y, color = color1))

color1 包含

  "O[3] some additional text"

图例显示为“O[3] 一些附加文本”,而不是带有下标的 3。

【问题讨论】:

  • 如果this question没有回答你的问题,你能详细解释一下原因吗?
  • 在您链接到的问题/答案中,相关的代码行是“labels=c(expression(b[1]), expression(c[1])”。我想替换"expression(b[1]" 带有一个包含 O[3] 的变量并将其解释为 O 下标 3。我不知道如何实现这一点。
  • 您必须在某些时候自己将文本转换为表达式。据我所知,没有其他方法。

标签: r ggplot2 subscript


【解决方案1】:

问题是你需要标尺中的标签是一个表达式,以便在渲染时按照plotmath的规则进行渲染。但是,ggplot 与data.frames 一起使用,data.frames 不能有一个作为表达式向量的列。所以解决这个问题的方法是将信息存储为plotmath 表达式的文本(字符串)版本,并且作为制作标签的最后一步,将它们转换为表达式。之所以可以这样做,是因为 scale 函数的 labels 参数本身可以是一个可以转换/格式化标签的函数。

把这个和你的例子放在一起:

color1 <- paste(gasSubscript,"*\" some additional text\"")

现在这是一种可以做成表达式的格式。

> color1
[1] "O[3] *\" some additional text\""
> cat(color1)
O[3] *" some additional text"
> parse(text=color1)
expression(O[3] *" some additional text")

使用该格式,您可以强制比例将标签解释为表达式,这将导致它们按照plotmath 的规则呈现。

testPlot <- ggplot(data = df, aes(x = x)) + 
  geom_line(aes(y = y, color = color1)) +
  scale_colour_discrete(labels = function(x) parse(text=x))

使用labels 函数方法也适用于存储在data.frame 中的数据,只要对字符串进行格式化以便可以对其进行解析。

DF <- data.frame(x=1:4, y=rep(1:2, times=2), 
                 group = rep(c('O[3]*" some additional text"', 
                               'H[2]*" some different text"'), each = 2))

ggplot(DF, aes(x, y, colour=group)) + 
  geom_line() +
  scale_colour_discrete(labels=function(x) parse(text=x))

【讨论】:

  • 这行得通。谢谢!但我真的不明白其中的逻辑。我怀疑是对 ggplot2 的复杂性缺乏了解。鉴于这些复杂性以及我可能会经常使用它的事实,您能否推荐一两个资源(书籍、链接)来提供更深入的解释。亚马逊有一堆声称可以做到这一点的书,所以我的问题是选择焦虑!
  • @GeraldNelson 我个人不能推荐任何特定的书。我没有从一本书中学习,因为当时没有。
  • 这可行,但所有标签都向右对齐,如果您有多个标签,这看起来很奇怪。
【解决方案2】:

这应该做我认为你想要的。我花了一些时间来获得正确的粘贴和表达顺序。

require(ggplot2)
test <- data.frame(x = c(1,2,3,4,5,6,7,8,9,10), y = c(10,9,8,7,6,5,4,3,2,1))
colour1 <- "1"

testPlot <- ggplot(data = test, aes(x = x)) + geom_line(aes(y = y, colour = colour1))
testPlot + scale_colour_discrete(labels = c(expression(paste(O[3], "some other text here"))))

它也会返回警告

Warning message:
In is.na(scale$labels) :
  is.na() applied to non-(list or vector) of type 'expression'

我无法找到解释。

【讨论】:

  • 这个答案不适合我。我需要解释变量 gasSubscript,而不是将定义 gasSubscript (paste(O[3], "some other text here")) 的代码放入表达式代码中。
猜你喜欢
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 2020-12-24
  • 1970-01-01
  • 2022-08-24
  • 2011-10-24
相关资源
最近更新 更多