Пользовательская группа означает функцию для ggpairs

Согласно документации функции ggpairs() в пакете GGally R, можно указывать пользовательские функции в качестве входных данных для аргумента "lower"/"upper". Для непрерывно-дискретных комбинаций переменных я хотел бы просто отобразить средние значения непрерывной переменной в категориях категориальной переменной (предпочтительно с использованием точек, а не столбцов), если это возможно, дополнительно стратифицировать с помощью другой категориальной переменной с использованием эстетики цвета.

Я нашел некоторую информацию в следующей теме:

https://github.com/ggobi/ggally/issues/218

Однако мои знания о ggpairs (и ggplot2) слишком поверхностны, чтобы можно было создать такую ​​пользовательскую функцию из шаблона в потоке (также, как представляется, имя переменной "Species" жестко запрограммировано в шаблоне, и я бы предпочел, чтобы не иметь никакой жестко закодированной информации в пользовательской функции, если это вообще возможно).

Я был бы очень признателен, если бы кто-нибудь мог помочь мне с шаблоном или эскизом решения, например, используя следующий пример (где "custom_function" необходимо заменить на функцию, описанную выше):

dat <- reshape::tips
pm <- ggpairs(dat,
              mapping = aes(color = sex, alpha = 0.3),
              columns = c("total_bill", "smoker", "time", "tip"),
              showStrips = T,
              lower = list(combo = custom_function))
print(pm)

1 ответ

Решение

Основываясь на комментарии @aosmith, я сделал пользовательскую функцию, которая, кажется, работает достаточно хорошо для моих целей, до сих пор не тестировал ее всесторонне, но, возможно, она все равно полезна:

library(GGally)
library(ggplot2)
library(ggstance)

gmean_point <- function(data, mapping, ...) {

  x <- eval(mapping$x, data)
  y <- eval(mapping$y, data)

  if(is.numeric(y)) {
    p <- ggplot(data) +
      geom_blank(mapping) +
      stat_summary(mapping,
                   geom = 'point', fun.y = mean,
                   position = position_dodge(width = 0.2))
  } else {
    p <- ggplot(data) +
      geom_blank(mapping) +
      stat_summaryh(mapping,
                    geom = 'point', fun.x = mean,
                    position = position_dodgev(height = 0.2))
  }

  p

}

pm <- ggpairs(reshape::tips,
              mapping = aes(color = sex, alpha = 0.3),
              columns = c("total_bill", "smoker", "time", "tip"),
              showStrips = T,
              lower = list(combo = gmean_point),
              upper = list(combo = 'box'))
print(pm)

Сюжет производится по коду выше

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