Створіть матрицю розсіювачів (пар () еквівалент) у ggplot2


117

Чи можна побудувати матрицю розкиданих ділянок за ggplot2допомогою ggplotприємних функцій, таких як відображення додаткових факторів на колір, форму тощо та додавання більш плавного?

Я думаю про щось подібне до baseфункції pairs.


17
Огляньте також поглядом
hadley

1
Ах, я не бачив твого коментаря там Хедлі. Я зробив свою відповідь CW, щоб не вкрасти ваш
кредит

Відповіді:


37

Ви можете спробувати plotmatrix:

  library(ggplot2)
  data(mtcars)
  plotmatrix(mtcars[,1:3])

для мене mpg (перша колонка в mtcars) не повинна бути фактором. Я не перевірив це, але немає причини, чому він повинен бути таким. Однак я отримую розкид сюжету :)


Примітка. Для подальшого ознайомлення plotmatrix()функцію було замінено ggpairs()функцією з GGallyпакету, як підказує @ naught101 в іншій відповіді нижче на це питання.


Мені не вдалося вирішити цю проблему, але, здається, потрібні фактори з правої сторони формули. Або ви могли б надати мені мінімальний приклад?
Карстен В.

1
Хтось знає, як додати колір? Я , здається, не бути в змозі отримати цю gist.github.com/1405150 на роботу
Etienne Low-Decarie

1
Перша частина цієї відповіді неправильна і викликає розгубленість. Ви не можете робити парні графіки з гранітною обробкою: ви можете робити y по x графіків і групувати їх за факторами. Іншими словами, з облицюванням у вас однакові х і у на кожному піддіаграмі; з парами, ви маєте різний х у кожному стовпчику та різний y у кожному рядку.
naught101

28
Для подальшого ознайомлення, plotmatrix()функція була замінена ggpairs()функцією з GGallyпакета, як пропонує @ naught101 в іншій відповіді на це запитання.
smillig

1
@MattBannert додав коментар до вашого допису, щоб зробити його більш помітним, я міг би зрозуміти прихильників, якби пропустив читання коментарів. Сподіваюся, ви не заперечуєте.
zx8754

232

Я постійно хочу це робити, але plotmatrix - це лайно. Хедлі рекомендує замість цього використовувати пакет GGally . Він має функцію ggpairs, яка є значно вдосконаленою діаграмою пар (дозволяє використовувати неперервні змінні у ваших кадрах даних). Він накреслює різні ділянки в кожному квадраті, залежно від типів змінних:

library(GGally)
ggpairs(iris, aes(colour = Species, alpha = 0.4))

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


26
Це справді чудово. Варто зазначити, що будь-яка colourзмінна повинна бути фактором; витратив 45 хвилин на розгадування цього.
gregmacfarlane

1
Чи є спосіб побудувати ці кореляційні матриці без пар? Наприклад, мені потрібно побудувати перший стовпець проти кожного іншого. хочу 1-ю колону проти інших лише 9
Rgeek

1
@Rgeek: ви могли б meltвикористовувати фрейм даних, використовуючи змінну, яка вас цікавить, як змінну id, а потім фацетом інших змінних.
naught101

6
Не використовуйте ggpairs, просто використовуйте ggplot2 нормально, як ggplot(data, aes(x=id, y=value)) + geom_point() + facet_grid(.~variable). Я припускаю, що ви говорите про розсіювання сюжетів, коли ви говорите "кореляційний сюжет", тому що я ніколи не чув про це інакше.
naught101

3
@JimGreen GGally::ggpairs(iris, aes(colour = Species, alpha=0.4))
ElBaulP

17

Якщо хочеться отримати ggplotоб'єкт (не ggmatrixяк у випадку ggpairs()), рішення полягає в тому, щоб плавити дані двічі, а потім ggplotз фацетом. facet_wrapбуло б краще, ніж facet_gridу обмеженні ділянки на ділянці, враховуючи поданий scales = 'free'параметр.

require(ggplot2) 
require(dplyr)
require(tidyr)

gatherpairs <- function(data, ..., 
                        xkey = '.xkey', xvalue = '.xvalue',
                        ykey = '.ykey', yvalue = '.yvalue',
                        na.rm = FALSE, convert = FALSE, factor_key = FALSE) {
  vars <- quos(...)
  xkey <- enquo(xkey)
  xvalue <- enquo(xvalue)
  ykey <- enquo(ykey)
  yvalue <- enquo(yvalue)

  data %>% {
    cbind(gather(., key = !!xkey, value = !!xvalue, !!!vars,
                 na.rm = na.rm, convert = convert, factor_key = factor_key),
          select(., !!!vars)) 
  } %>% gather(., key = !!ykey, value = !!yvalue, !!!vars,
               na.rm = na.rm, convert = convert, factor_key = factor_key)
}

iris %>% 
  gatherpairs(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) %>% {
  ggplot(., aes(x = .xvalue, y = .yvalue, color = Species)) +
      geom_point() + 
      geom_smooth(method = 'lm') +
      facet_wrap(.xkey ~ .ykey, ncol = length(unique(.$.ykey)), scales = 'free', labeller = label_both) +
      scale_color_brewer(type = 'qual')
}

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.