Создайте матрицу диаграмм рассеяния (эквивалент пары ()) в ggplot2

117

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

Я думаю о чем-то похожем на baseфункцию pairs.

Карстен В.
источник
17
Также посмотрите ggally
Хэдли
1
Ах, я не видел твоего комментария там, Хэдли. Я ответил CW, чтобы не украсть вашу репутацию :)
naught101

Ответы:

37

Вы можете попробовать plotmatrix:

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

для меня миль на галлон (первый столбец в mtcars) не должно быть фактором. Я не проверял, но нет причин, почему это должно быть. Однако я получаю диаграмму рассеяния :)


Примечание. Для справки в будущем эта plotmatrix()функция была заменена ggpairs()функцией из GGallyпакета, как предлагает @ naught101 в другом ответе на этот вопрос ниже.

Мэтт Баннерт
источник
Я не смог заставить работать фасетку над этой проблемой, кажется, это требует факторов в правой части формулы .. Или вы могли бы привести мне минимальный пример?
Карстен В.
1
Кто-нибудь знает, как добавить цвет? Кажется, я не могу заставить этот gist.github.com/1405150 работать
Этьен Лоу-Декари
1
Первая часть этого ответа неверна и вызывает путаницу. Вы не можете строить парные графики с фасетами: вы можете строить только графики y на x и группировать их по факторам. Другими словами, с фасетированием у вас есть одинаковые x и y на каждом участке; с парами у вас есть разные x в каждом столбце и разные y в каждой строке.
naught101
28
Для справки в будущем plotmatrix()функция была заменена ggpairs()функцией из GGallyпакета, как предлагает @ naught101 в другом ответе на этот вопрос.
smillig
1
@MattBannert добавил комментарий к вашему сообщению, чтобы сделать его более заметным, я мог бы понять тех, кто проголосовал против, если бы пропустил чтение комментариев. Надеюсь, ты не против.
zx8754 05
232

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

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

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

naught101
источник
26
Это действительно здорово. Стоит отметить, что любая colourпеременная должна быть фактором; потратил 45 минут на выяснение этого.
gregmacfarlane
1
Есть ли способ построить эти корреляционные матрицы без пар? Например, мне нужно построить график первого столбца по сравнению с каждым другим столбцом. Gpairs дает очень возможную пару. Например, у меня есть 10 столбцов, и это дает мне 10 * 10 = 100. Но я хочу только
первую
1
@Rgeek: вы можете meltиспользовать фрейм данных, используя интересующую вас переменную в качестве переменной id, а затем фасетировать другие переменные.
naught101 05
6
Не используйте ggpairs, просто используйте ggplot2 как обычно, например ggplot(data, aes(x=id, y=value)) + geom_point() + facet_grid(.~variable). Я предполагаю, что вы говорите о диаграммах рассеяния, когда говорите «график корреляции», потому что я никогда не слышал об этом иначе.
naught101 07
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')
}

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

mjktfw
источник