Buat matriks scatterplots (pasangan () ekuivalen) di ggplot2


117

Apakah mungkin untuk memplot matriks plot sebar dengan ggplot2, menggunakan ggplotfitur bagus seperti memetakan faktor tambahan ke warna, bentuk, dll. Dan menambahkan lebih halus?

Saya sedang memikirkan sesuatu yang mirip dengan basefungsinya pairs.


17
Lihat juga ggally
hadley

1
Ah, saya tidak melihat komentar Anda di sana hadley. Saya membuat jawaban saya CW agar tidak mencuri kredibilitas Anda :)
naught101

Jawaban:


37

Anda mungkin ingin mencoba plotmatrix:

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

bagi saya mpg (kolom pertama di mtcars) seharusnya tidak menjadi faktor. Saya belum memeriksanya, tetapi tidak ada alasan mengapa harus menjadi satu. Namun saya mendapatkan plot pencar :)


Catatan: Untuk referensi di masa mendatang, plotmatrix()fungsi tersebut telah diganti dengan ggpairs()fungsi dari GGallypaket seperti yang disarankan @ naught101 dalam respons lain di bawah ini untuk pertanyaan ini.


Saya tidak bisa mendapatkan faceting untuk menangani masalah ini, tampaknya ini membutuhkan faktor di sisi kanan rumus .. Atau dapatkah Anda memberi saya contoh minimal?
Karsten W.

1
Ada yang tahu cara menambahkan warna? Sepertinya saya tidak bisa membuat gist.github.com/1405150 ini berfungsi
Etienne Low-Décarie

1
Bagian pertama dari jawaban ini salah, dan menyebabkan kebingungan. Anda tidak dapat membuat plot berpasangan dengan faceting: Anda hanya dapat melakukan y dengan x plot, dan mengelompokkannya berdasarkan faktor. Dengan kata lain, dengan faceting Anda memiliki x dan y yang sama di setiap sub-plot; dengan pasangan, Anda memiliki x yang berbeda di setiap kolom, dan y yang berbeda di setiap baris.
n nothing101

28
Untuk referensi di masa mendatang, plotmatrix()fungsi tersebut telah diganti dengan ggpairs()fungsi dari GGallypaket seperti yang disarankan @ naught101 dalam respons lain untuk pertanyaan ini.
smillig

1
@MattBannert menambahkan komentar ke posting Anda agar lebih terlihat, saya bisa memahami downvoters jika melewatkan membaca komentar. Harap Anda tidak keberatan.
zx8754

232

Saya tetap ingin melakukan ini, tetapi plotmatrix adalah omong kosong. Hadley merekomendasikan untuk menggunakan paket GGally sebagai gantinya. Ini memiliki fungsi, ggpairs yang merupakan plot pasangan yang jauh lebih baik (memungkinkan Anda menggunakan variabel non-kontinu dalam bingkai data Anda). Ini memplot plot yang berbeda di setiap kotak, tergantung pada jenis variabel:

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

masukkan deskripsi gambar di sini


26
Ini sangat bagus. Perlu dicatat bahwa colourvariabel apa pun harus menjadi faktor; menghabiskan 45 menit untuk memikirkan yang satu itu.
gregmacfarlane

1
Apakah ada cara untuk memplot matriks korelasi ini tanpa pasangan? Misalnya saya perlu memplot kolom pertama versus setiap kolom lainnya. Pasangan memberikan pasangan yang sangat mungkin. Misalnya, saya memiliki 10 kolom dan itu memberi saya 10 * 10 = 100. Tapi saya ingin kolom 1 vs hanya 9 lainnya
Rgeek

1
@Rgeek: Anda bisa meltdataframe menggunakan variabel yang Anda minati sebagai variabel id, dan kemudian di-facet oleh variabel lain.
n nothing101

6
Jangan gunakan ggpairs, gunakan saja ggplot2 seperti biasa, seperti ggplot(data, aes(x=id, y=value)) + geom_point() + facet_grid(.~variable). Saya berasumsi Anda berbicara tentang plot pencar ketika Anda mengatakan "plot korelasi", karena saya belum pernah mendengarnya sebaliknya.
n nothing101

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

17

Jika seseorang ingin mendapatkan suatu ggplotobjek (tidak ggmatrixseperti kasus ggpairs()), solusinya adalah mencairkan data dua kali, kemudian ggplotdengan facetting. facet_wrapakan lebih baik daripada facet_gridmembatasi area yang diplot, mengingat scales = 'free'parameter disediakan.

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')
}

masukkan deskripsi gambar di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.