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.frames не может иметь столбец, который является вектором выражений. Таким образом, способ обойти это сохранить информацию в виде текстовой (строковой) версии 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'

которому я не смог найти объяснения.

Другие вопросы по тегам