R - 解释 ggplot 中使用的变量中的下标
R - Interpreting a subscript in a variable used in ggplot
我正在使用 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] some additional text" 而不是下标 3.
我认为这应该符合您的要求。我花了一点时间来调整粘贴和表达的正确顺序。
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"))))
它也returns警告
Warning message:
In is.na(scale$labels) :
is.na() applied to non-(list or vector) of type 'expression'
对此我找不到解释。
问题是你需要scale里面的label是一个表达式,这样渲染的时候,按照plotmath
的规则渲染。但是,ggplot
与 data.frame
s 一起使用,而 data.frame
s 不能有作为表达式向量的列。所以解决这个问题的方法是将信息存储为 plotmath
表达式的文本(字符串)版本,并且作为制作标签的最后一步,将它们转换为表达式。这是可以做到的,因为比例函数的 labels
参数本身可以是一个可以 transform/format 标签的函数。
将此与您的示例放在一起:
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))
我正在使用 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] some additional text" 而不是下标 3.
我认为这应该符合您的要求。我花了一点时间来调整粘贴和表达的正确顺序。
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"))))
它也returns警告
Warning message:
In is.na(scale$labels) :
is.na() applied to non-(list or vector) of type 'expression'
对此我找不到解释。
问题是你需要scale里面的label是一个表达式,这样渲染的时候,按照plotmath
的规则渲染。但是,ggplot
与 data.frame
s 一起使用,而 data.frame
s 不能有作为表达式向量的列。所以解决这个问题的方法是将信息存储为 plotmath
表达式的文本(字符串)版本,并且作为制作标签的最后一步,将它们转换为表达式。这是可以做到的,因为比例函数的 labels
参数本身可以是一个可以 transform/format 标签的函数。
将此与您的示例放在一起:
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))