Можно ли каким-то образом связать выражение единицы математической оси из списка или фрейма данных с осью ggplot? - PullRequest
0 голосов
/ 27 мая 2020

Интересно, можно ли создать полуавтоматический c синтаксический анализ «сложных» математических выражений на оси ggplot, поддерживая какую-то таблицу поиска?

Так, например, для данных -Майнинг, мне регулярно приходится создавать сотни диаграмм рассеяния, которые я хочу обсудить с коллегами. Для этого, конечно, мне нужны правильные легенды осей - это довольно громоздко. Вот простой пример того, что хотелось бы считать из базы данных в labs () с помощью формулы: expression(paste(delta^{18},"O (\u2030)") Итак, мне было интересно, есть ли способ связать эти labs () с предопределенными списками или таблицами в способ вроде лаборатории (y = list [3])? Это отлично работает для простых имен, таких как: «Насыщение растворенным кислородом /%», но при попытке сделать то же самое для приведенного выше он генерирует:

paste(delta^{
    18
}, "O (‰)")

(включая перерывы - что, очевидно, не то, что я хочу )

Спасибо, Алекс

1 Ответ

0 голосов
/ 27 мая 2020

Вы можете немного повозиться с функцией math_format() из пакета scale, чтобы использовать предварительно замененные выражения:

library(patchwork)
library(ggplot2)

splitiris <- split(iris, iris$Species)

# Example expressions
exprs <- list(
  substitute(10^.x),
  substitute(log[.x]~"(%)"),
  substitute(frac(.x, 2))
)

# Near-copy of scales::math_format
math_format2 <- function(expr = subsitute(10^.x), format = force) {
  .x <- NULL
  subs <- function(x) {
    do.call("substitute", list(expr, list(.x = x)))
  }
  function(x) {
    x <- format(x)
    ret <- lapply(x, subs)
    ret <- as.expression(ret)
    ret[is.na(x)] <- NA
    names(ret) <- names(x)
    ret
  }
}

# Generate plots
plots <- lapply(seq_along(splitiris), function(i) {
  ggplot(splitiris[[i]], aes(Sepal.Width, Sepal.Length)) +
    geom_point() +
    scale_x_continuous(labels = math_format2(exprs[[i]]))
})

plots[[1]] + plots[[2]] + plots[[3]]

Created on 2020 -05-27 с помощью пакета REPEX (v0.3.0)

...