R/ggplot2: оценить объект внутри выражения

Пример кода:

rsq <- round(cor(mtcars$disp, mtcars$mpg)^2, 2) # rsq = 0.72

ggplot(mtcars, aes(x = disp, y = mpg)) +
  geom_point() +
  geom_smooth(method = lm, aes(color = "Linear")) +
  scale_color_discrete(labels = expression(paste("R"^2, " = ", rsq)))

Я хотел бы, чтобы легенда отображалась как R² = 0.72.
Я знаю, что могу просто использовать символ Юникода для ², чтобы получить верхний индекс, но в целом я думаю, что должен быть способ комбинировать математические выражения и вычисляемые значения, хранящиеся в объекты.

Я пытался поиграть с eval и различными комбинациями paste, но, кажется, я продолжаю сталкиваться с одной и той же проблемой.

Изменить № 1:
я попытался использовать bquote в соответствии с этим ответьте так:

scale_color_discrete(labels = bquote(R^2 == .(rsq)))

Оказывается, легенда отображается только как ==.

Редактировать № 2:
Несмотря на то, что приведенный ниже ответ работает, он кажется… очень неудобным для более сложных выражений, например:

Я все еще надеюсь на более простое решение.


person Jemus42    schedule 12.03.2016    source источник


Ответы (2)


Оказывается, дело с bquote было близко.
Это работает (хотя кажется… неоптимальным):

  scale_color_discrete(labels = as.expression(bquote(R^2~"="~.(rsq))))

Также работает:

 scale_color_discrete(labels = as.expression(bquote(R^2 == .(rsq))))

По-видимому, ~ требуется «вставить» элементы вместе, фактически не paste() их? И as.expression делает то, что не смог expression. Я не уверен, что именно происходит, но, увы, это работает:

Большое спасибо, Питер Далгаард!

person Jemus42    schedule 12.03.2016

Я заметил, что начиная с версии 3.3.2 пакета ggplot2 и scale_color_discrete(), и scale_color_manual() теперь принимают метки bquote() напрямую. Предположительно, это изменение более широко применимо к другим функциям scale_, но я не проверял их более широко.

Однако более простые подходы, такие как geom_line(aes(color = bquote(...))) и geom_line(aes(color = as.expression(bquote(...)))), по-прежнему отвергаются как имеющие недопустимую эстетику.

data = data.frame(x = seq(0, 5, length.out = 50))
data$exp1 = 1 - exp(-data$x)
data$exp0.5 = 1 - exp(-0.5 * data$x)
ggplot(data, aes(x = x)) + geom_line(aes(y = exp1, color = "exp1")) + 
  geom_line(aes(y = exp0.5, color = "exp0.5")) +
  scale_color_manual(labels = c(bquote(1 - e^-x), bquote(1 - e^"-0.5x")), values = c("blue", "green")) + # or scale_color_discrete(labels = c(bquote(1 - e^-x), bquote(1 - e^"-0.5x")))
  labs(y = "y") + theme(legend.position = c(0.8, 0.15))

ggplot с цветовыми метками в кавычках

person Todd West    schedule 17.08.2020