Как настроить график со второй линией корреляции в ggpairs

После сообщения Как настроить линии в ggpairs [GGally] Я сделал графиквведите здесь описание изображения, используя приведенный ниже код;

library("GGally")
library("ggplot2")
data(iris)

lowerFn <- function(data, mapping, method = "lm", ...) {
  p <- ggplot(data = data, mapping = mapping) +
    geom_point(colour = "blue") +
    geom_smooth(method = method, color = "red", ...)
  p
}

ggpairs(
  iris[, 1:4], lower = list(continuous = wrap(lowerFn, method = "lm")),
  diag = list(continuous = wrap("barDiag", colour = "blue")),
  upper = list(continuous = wrap("cor", size = 10))
)

Мой вопрос;

  1. Как я могу сделать диаграмму матрицы диаграммы рассеяния в том же стиле, добавив эффект переменной Sil в качестве линий корреляции на графике. Как этот график, показывающий переменный эффект Si в виде двух линий корреляции введите здесь описание изображения

данные находятся здесь (данные радужной оболочки глаза с добавленной переменной Sil) docs.google.com/spreadsheets/d/15voAmJ7vcozmHYKYnHxFd_3A3fkkIvzQV6zi44lIEGg/edit#gid=0


person washfaq    schedule 17.02.2021    source источник


Ответы (1)


Если вы хотите раскрасить точки и создать регрессионную линию по группам, вам нужно сопоставить эстетику с некоторой переменной.

В общем случае вы можете добавить сопоставление на верхний уровень, и это разделит все панели по группам.

ggpairs(iris, columns=1:4, mapping=aes(colour=Species))

Однако я думаю, что вам нужно проделать немного больше работы, если вы хотите построить график по группам только в одной части панели. Один из способов — сначала изменить вашу пользовательскую функцию на следующую. Это обеспечивает дополнительный параметр emap, который будет управлять эстетикой только в lowerFn.

lowerFn <- function(data, mapping, emap=NULL, method = "lm", ...) {
  # mapping <- c(mapping, emap)
  # class(mapping) = "uneval" # need this to combine the two aes
  # Can use this instead
  mapping <- ggplot2:::new_aes( c(mapping, emap))
  p <- ggplot(data = data, mapping = mapping) +
    geom_point() +
    geom_smooth(method = method, ...) +
    theme_classic() # to get the white background and prominent axis
  p
}

Затем вы можете вызвать его следующим образом, что должно оставить диагональную и верхнюю эстетику в покое.

ggpairs(
  iris, columns=1:4,
  lower = list(continuous = wrap(lowerFn, 
                                 method = "lm", fullrange=TRUE, se=FALSE,
                                 emap=aes(color=Species))))                             

Это производит

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

Конечно, вы можете просто жестко закодировать свою группирующую переменную в пользовательской функции:

lowerFn <- function(data, mapping, method = "lm", ...) {
  p <- ggplot(data = data, mapping = mapping) +
    geom_point(aes(colour=Species)) +
    geom_smooth(method = method, aes(colour=Species), ...)
  p
}

ggpairs(
  iris, columns=1:4,
  lower = list(continuous = 
                 wrap(lowerFn, method = "lm", 
                      fullrange=TRUE, se=FALSE)))

Комментарий: когда вы добавляете параметр colour к geom_point или geom_smooth в своей пользовательской функции, он отменяет сопоставленный colour, например. сравните результаты со следующими

ggplot(iris, aes(Sepal.Length, Sepal.Width, col=Species)) +
  geom_smooth(se=FALSE)

ggplot(iris, aes(Sepal.Length, Sepal.Width, col=Species)) +
  geom_smooth(col="red", se=FALSE)

Вопрос? Как ввести ключ для линии регрессии на графике?

Если бы вы использовали эстетику глобального / верхнего уровня, вы могли бы использовать ggpairs(iris, columns=1:4, aes(colour=Species), legend=1) и обычные функции ggplot theme для управления ею. Здесь этого сделать нельзя, так как группирующая переменная использовалась в пользовательской функции. Однако пакет предоставляет средства для добавления пользовательских легенд с аргументом legend; вы можете создать фиктивную легенду за пределами ggpairs, а затем добавить ее во время построения графика.

leg <- grab_legend(ggplot(data=iris, aes(x=NA, y=NA, colour=Species)) +
              geom_line() + theme(legend.direction = "horizontal"))

ggpairs(
  iris, columns=1:4, legend=leg,
  lower = list(continuous = 
                 wrap(lowerFn, method = "lm", 
                      emap=aes(color=Species),
                      fullrange=TRUE, se=FALSE))) +
  theme(legend.position = "top")
person user20650    schedule 17.02.2021
comment
спасибо за помощь, это решило мою проблему. Дальнейшая помощь, плз, 1) как я могу удалить звездочки, показывающие верхний слой графика. 2) как ввести ключ для линии регрессии на графике? - person washfaq; 17.02.2021
comment
Пожалуйста. Насколько мне известно, звездочки жестко закодированы, но см. cor_fun из stackoverflow.com/questions/37889222/ для способов изменения соответствующей функции. Что касается уравнения, см. .com/questions/65360849/how-to-get-r2-with-ggpairs/ — вам нужно будет настроить функцию, чтобы показать eqn. вместо r^2, но вы можете использовать тот же подход. - person user20650; 17.02.2021
comment
@ user20650, еще раз спасибо за помощь. Я посмотрю ссылку. - person washfaq; 17.02.2021
comment
@WaseemAshfaq; см. редактирование легенды - person user20650; 18.02.2021
comment
теперь он работает нормально для меня. Спасибо. - person washfaq; 18.02.2021
comment
Здравствуйте, надеюсь, у вас все отлично. Есть ли способ заменить «corr» в поле на «R»? - person washfaq; 23.05.2021
comment
Привет @washfaq; Я написал небольшую функцию stackoverflow.com/questions/37889222/, который изменил размер текста корреляции в соответствии с абсолютным значением значения корреляции. Взгляните на этот пример, чтобы увидеть, как вы можете настроить его для другой статистики или другого текста. - person user20650; 23.05.2021
comment
... на самом деле, если вы просто хотите изменить текст с corr: на R:, тогда ggally_cor теперь принимает аргумент title, который, похоже, сделает это. См. первый пример в ?ggally_cor и измените на p_(ggally_cor(tips, mapping = ggplot2::aes_string(x = "total_bill", y = "tip"), title="R:")) - person user20650; 23.05.2021
comment
Большое спасибо, это работает очень хорошо. Очень ценим помощь. - person washfaq; 23.05.2021
comment
Привет User20650, можно ли вам ответить на этот вопрос, я буду вам очень благодарен. stackoverflow.com/questions/68459268/ - person washfaq; 21.07.2021
comment
@washfaq ; повторите ваш новый вопрос, если вам нужны отдельные строки (нижние) и корреляции (верхние), почему бы просто не сделать ggpairs(iris, columns=1:4, mapping=aes(colour=Species)) - person user20650; 21.07.2021
comment
Спасибо за ваш ответ. Я хочу отдельное поле корреляции тепловой карты для обеих обработок Si. Возможно ли, что коробку можно разделить на две части для сравнения эффекта лечения? - person washfaq; 21.07.2021
comment
о, так вы хотите два цветных прямоугольника для каждой корреляции? Я уверен, что это выполнимо. Вероятно, нужно перейти на использование geom_rect (или аннотации) вместо panel.background - person user20650; 21.07.2021
comment
можете ли вы ответить на вопрос для моего понимания всякий раз, когда у вас есть время, я пробовал этот ответ, но не смог сделать это stackoverflow.com/questions/14669568/ - person washfaq; 21.07.2021