Добавить текст в диаграмму рассеяния ggpairs()?

глупый, но сводящий с ума вопрос: как добавить текстовые метки к точкам диаграммы рассеяния на графике ggpairs(...)? ggpairs(...) из библиотеки GGally. Обычная функция geom_text(...), похоже, не подходит, так как она принимает аргументы x, y, а ggpairs создает матрицу NxN графиков с разным стилем.

Данные не показаны, но представьте, что у меня есть столбец с именем ID с идентификаторами каждой точки, отображаемой на диаграммах рассеяния.

С удовольствием добавлю данные, если это поможет, но не уверен, что это необходимо. А может быть, ответ просто в том, что к ggpairs(...) нельзя добавлять текстовые метки?

library(ggplot2)
library(GGally)

ggpairs(hwWrld[, c(2,6,4)], method = "pearson")

введите здесь описание изображения

Примечание. Добавление меток предназначено для моей личной справки. Так что не нужно говорить мне, что это будет выглядеть как полный беспорядок. Так и будет. Я просто пытаюсь определить свои выбросы.

Спасибо!


person nghess    schedule 23.10.2020    source источник


Ответы (1)


Это, безусловно, возможно. Глядя на документацию для ?GGally::ggpairs, есть три аргумента, upper, lower и diag, которые из деталей документации

Верхний и нижний — это списки, которые могут содержать переменные «непрерывный», «комбинированный», «дискретный» и «на». Каждый элемент списка может быть функцией или строкой.

... (подробнее)

Если функция предоставляется в качестве опции для верхнего, нижнего или диаг., она должна реализовывать функцию API из function(data, mapping, ...){#make ggplot2 plot}. Если для конкретной функции требуется установка параметров, wrap(fn, param1 = val1, param2 = val2) функция с ее параметрами.

Таким образом, способ создания метки состоит в том, чтобы перезаписать значение графика по умолчанию. Например, если мы хотим написать hello world в верхнем треугольнике, мы можем сделать что-то вроде:

library(ggplot2)
library(GGally)
#' Plot continuous upper function, by adding text to the standard plot
#' text is placed straight in the middle, over anything already residing there!
continuous_upper_plot <- function(data, mapping, text, ...){
  p <- ggally_cor(data, mapping, ...)
  if(!is.data.frame(text))
    text <- data.frame(text = text)
  lims <- layer_scales(p)
  p + geom_label(data = text, aes(x = mean(lims$x$range$range), 
                                  y = mean(lims$y$range$range), 
                                  label = text), 
                 inherit.aes = FALSE) 
}
ggpairs(iris, upper = list(continuous = wrap(continuous_upper_plot, 
                                                     text = 'hello world')))

с конечным результатом: введите здесь описание изображения

Здесь нужно отметить 3 вещи:

  1. Я решил добавить текст в саму функцию. Если ваш текст является частью ваших существующих данных, достаточно просто использовать аргумент mapping (aes) при вызове функции. И это, вероятно, также лучше, так как вы хотите добавить текст в определенные точки.
  2. Если у вас есть какие-либо дополнительные аргументы для функции (вне data и mapping), вам нужно будет использовать wrap, чтобы добавить их в вызов.
  3. В документации к функции конкретно указано, что аргументы должны быть data, mapping, а не стандартными для ggplot2, которые равны mapping, data. Таким образом, для любой из функций ggplot потребуется небольшая оболочка, меняющая свои позиции, чтобы перезаписать аргументы по умолчанию для ggpairs.
person Oliver    schedule 23.10.2020
comment
Очень полезная информация. Добавление столбца id в качестве меток диаграммы рассеяния можно выполнить с помощью ggpairs(df, lower = list(continuous = function(data, mapping, ...) ggally_points(data, mapping, ...) + geom_text(aes(label = id)))). - person Paul; 23.10.2020
comment
Убийственный ответ. Спасибо. Мне было стыдно задавать такой хромой вопрос, но это очень полезно, и я обязательно поделюсь информацией со своими коллегами. - person nghess; 23.10.2020
comment
Когда вы начинаете использовать GGally, это определенно не интуитивно понятно, но это значительно снижает нагрузку. Рад, что смог помочь, и спасибо @Paul за конкретный пример для вашего случая. :-) - person Oliver; 23.10.2020