R - Интерпретация индекса в переменной, используемой в ggplot
Я использую ggplot для создания многострочных графиков, которые построены с большим количеством переменных и использованием пасты. Я не смог выяснить, как заставить индекс 3 в O3 появляться в следующей упрощенной версии кода.
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.
2 ответа
Проблема в том, что вам нужно, чтобы метка в масштабе была выражением, чтобы при ее отображении она отображалась в соответствии с правилами plotmath
, Тем не мение, ggplot
работает с data.frame
с и data.frame
s не может иметь столбец, который является вектором выражений. Таким образом, способ обойти это сохранить информацию в виде текстовой (строковой) версии plotmath
выражение и, как последний шаг для создания меток, превратить их в выражения. Это можно сделать, потому что 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))
Это должно делать то, что я думаю, что вы хотите. Мне понадобилось немного поработать, чтобы получить правильный порядок вставки и выражения.
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'
которому я не смог найти объяснения.