Saya ingin menempatkan dua plot berdampingan menggunakan paket ggplot2 , yaitu melakukan yang setara par(mfrow=c(1,2))
.
Sebagai contoh, saya ingin agar dua plot berikut ditampilkan berdampingan dengan skala yang sama.
x <- rnorm(100)
eps <- rnorm(100,0,.2)
qplot(x,3*x+eps)
qplot(x,2*x+eps)
Apakah saya harus meletakkannya di dalam data.frame yang sama?
qplot(displ, hwy, data=mpg, facets = . ~ year) + geom_smooth()
r
visualization
ggplot2
Christopher DuBois
sumber
sumber
Jawaban:
Setiap ggplot berdampingan (atau n plot pada grid)
Fungsi
grid.arrange()
dalamgridExtra
paket akan menggabungkan beberapa plot; ini adalah bagaimana Anda menempatkan dua sisi berdampingan.Ini berguna ketika kedua plot tidak didasarkan pada data yang sama, misalnya jika Anda ingin memplot variabel yang berbeda tanpa menggunakan membentuk kembali ().
Ini akan memplot output sebagai efek samping. Untuk mencetak efek samping ke file, menentukan driver perangkat (seperti
pdf
,png
, dll), misalnyaatau, digunakan
arrangeGrob()
dalam kombinasi denganggsave()
,Ini setara dengan membuat dua plot berbeda menggunakan
par(mfrow = c(1,2))
. Ini tidak hanya menghemat waktu dalam mengatur data, tetapi juga diperlukan saat Anda menginginkan dua plot yang berbeda.Lampiran: Menggunakan Aspek
Segi sangat membantu untuk membuat plot serupa untuk berbagai kelompok. Ini ditunjukkan di bawah ini dalam banyak jawaban di bawah, tetapi saya ingin menyoroti pendekatan ini dengan contoh yang setara dengan plot di atas.
Memperbarui
yang
plot_grid
fungsi dalamcowplot
adalah senilai check-out sebagai alternatifgrid.arrange
. Lihat jawaban oleh @ claus-wilke di bawah ini dan sketsa ini untuk pendekatan yang setara; tetapi fungsinya memungkinkan kontrol yang lebih baik pada lokasi dan ukuran plot, berdasarkan sketsa ini .sumber
?grid.arrange
membuat saya berpikir bahwa fungsi ini sekarang dinamakan mengaturGrob. Saya dapat melakukan apa yang saya inginkan dengan melakukana <- arrangeGrob(p1, p2)
dan kemudianprint(a)
.grid.arrange
masih merupakan fungsi yang valid dan tidak usang. Apakah Anda mencoba menggunakan fungsinya? Apa yang terjadi, jika tidak seperti yang Anda harapkan.Salah satu kelemahan dari solusi yang didasarkan pada
grid.arrange
adalah bahwa mereka membuat sulit untuk memberi label plot dengan huruf (A, B, dll), karena kebanyakan jurnal membutuhkan.Saya menulis paket cowplot untuk menyelesaikan masalah ini (dan beberapa lainnya), khususnya fungsinya
plot_grid()
:Objek yang
plot_grid()
kembali adalah objek ggplot2 lain, dan Anda dapat menyimpannyaggsave()
seperti biasa:Sebagai alternatif, Anda dapat menggunakan fungsi cowplot
save_plot()
, yang merupakan pembungkus tipisggsave()
yang memudahkan untuk mendapatkan dimensi yang benar untuk plot gabungan, misalnya:(
ncol = 2
Argumennya mengatakansave_plot()
bahwa ada dua plot berdampingan, dansave_plot()
membuat gambar yang disimpan dua kali lebih lebar.)Untuk deskripsi yang lebih mendalam tentang cara mengatur plot dalam kisi, lihat sketsa ini. Ada juga sketsa yang menjelaskan cara membuat plot dengan legenda bersama.
Satu hal yang sering membingungkan adalah bahwa paket cowplot mengubah tema ggplot2 default. Paket berperilaku seperti itu karena pada awalnya ditulis untuk penggunaan lab internal, dan kami tidak pernah menggunakan tema default. Jika ini menyebabkan masalah, Anda dapat menggunakan salah satu dari tiga pendekatan berikut untuk mengatasinya:
1. Atur tema secara manual untuk setiap plot. Saya pikir itu praktik yang baik untuk selalu menentukan tema tertentu untuk setiap plot, seperti yang saya lakukan
+ theme_bw()
pada contoh di atas. Jika Anda menentukan tema tertentu, tema default tidak masalah.2. Kembalikan tema default kembali ke default ggplot2. Anda dapat melakukan ini dengan satu baris kode:
3. Panggil fungsi cowplot tanpa melampirkan paket. Anda juga tidak dapat memanggil
library(cowplot)
ataurequire(cowplot)
memanggil fungsi cowplot dengan menambahkan terlebih dahulucowplot::
. Misalnya, contoh di atas menggunakan tema default ggplot2 akan menjadi:Pembaruan:
sumber
Anda dapat menggunakan
multiplot
fungsi berikut dari buku masak Winston Chang's Rsumber
Menggunakan paket tambal sulam , Anda cukup menggunakan
+
operator:sumber
Ya, metode Anda perlu mengatur data Anda dengan tepat. Salah satu caranya adalah ini:
Saya yakin ada trik yang lebih baik dalam plyr atau membentuk kembali - saya masih belum benar-benar mempercepat semua paket kuat oleh Hadley.
sumber
Menggunakan paket membentuk kembali Anda dapat melakukan sesuatu seperti ini.
sumber
Ada juga paket multipanelfigure yang layak untuk disebutkan. Lihat juga jawaban ini .
Dibuat pada 2018-07-06 oleh paket reprex (v0.2.0.9000).
sumber
ggplot2 didasarkan pada grafik kotak, yang menyediakan sistem berbeda untuk mengatur plot pada halaman. The
par(mfrow...)
perintah tidak memiliki setara langsung, grid benda (disebut grobs ) tidak selalu diambil segera, tetapi dapat disimpan dan dimanipulasi sebagai objek R biasa sebelum dikonversi ke output grafis. Ini memungkinkan fleksibilitas yang lebih besar daripada menggambar model grafis dasar yang sekarang ini , tetapi strateginya sedikit berbeda.Saya menulis
grid.arrange()
untuk menyediakan antarmuka sederhana sedekat mungkinpar(mfrow)
. Dalam bentuknya yang paling sederhana, kode tersebut akan terlihat seperti:Lebih banyak opsi dirinci dalam sketsa ini .
Salah satu keluhan umum adalah bahwa plot tidak perlu disejajarkan misalnya ketika mereka memiliki label sumbu dengan ukuran yang berbeda, tetapi ini dengan desain:
grid.arrange
tidak berusaha untuk objek kasus ggplot2 khusus, dan memperlakukannya sama dengan grob lain (plot kisi, misalnya ). Ini hanya menempatkan grob dalam tata letak persegi panjang.Untuk kasus khusus objek ggplot2, saya menulis fungsi lain
ggarrange
,, dengan antarmuka yang sama, yang mencoba menyelaraskan panel plot (termasuk plot yang difas) dan mencoba untuk menghormati rasio aspek ketika ditentukan oleh pengguna.Kedua fungsi tersebut kompatibel dengan
ggsave()
. Untuk tinjauan umum tentang berbagai opsi, dan beberapa konteks historis, sketsa ini menawarkan informasi tambahan .sumber
Pembaruan: Jawaban ini sudah sangat lama.
gridExtra::grid.arrange()
sekarang pendekatan yang direkomendasikan. Saya meninggalkan ini di sini kalau-kalau mungkin berguna.Stephen Turner memposting
arrange()
fungsi di blog Getting Genetics Done (lihat posting untuk instruksi aplikasi)sumber
grid.arrange
(seandainya saya tidak mempostingnya di milis pada saat itu - tidak ada cara untuk memperbarui sumber daya online ini), versi paket adalah pilihan yang lebih baik jika Anda bertanya kepada sayaMenggunakan
tidyverse
:sumber
Solusi di atas mungkin tidak efisien jika Anda ingin memplot banyak plot ggplot menggunakan loop (misalnya seperti yang ditanyakan di sini: Membuat banyak plot di ggplot dengan nilai sumbu Y yang berbeda menggunakan loop ), yang merupakan langkah yang diinginkan dalam menganalisis yang tidak diketahui ( atau besar) set data (misalnya, ketika Anda ingin memplot Hitungan semua variabel dalam set data).
Kode di bawah ini menunjukkan cara melakukannya menggunakan 'multiplot ()' yang disebutkan di atas, sumbernya ada di sini: http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2) :
Sekarang jalankan fungsi - untuk mendapatkan Hitungan untuk semua variabel dicetak menggunakan ggplot pada satu halaman
Satu hal yang perlu diperhatikan adalah:
menggunakan
aes(get(strX))
, yang biasanya Anda gunakan dalam loop ketika bekerja denganggplot
, dalam kode di atas bukannyaaes_string(strX)
TIDAK akan menggambar plot yang diinginkan. Sebagai gantinya, itu akan memplot plot terakhir berkali-kali. Saya belum tahu mengapa - mungkin harus melakukanaes
danaes_string
dipanggilggplot
.Kalau tidak, harap Anda akan menemukan fungsi yang bermanfaat.
sumber
plots
objekfor-loop
yang sangat tidak efisien dan tidak direkomendasikan masukR
. Silakan lihat tulisan-tulisan hebat ini untuk mengetahui cara-cara yang lebih baik untuk melakukannya: Akumulasi yang efisien dalam R , Menerapkan fungsi pada baris bingkai data & Alur kerja berorientasi baris di R dengan tidyversetidy evaluation
pendekatan yang telah tersedia sejakggplot2 v.3.0.0
stackoverflow.com/a/52045613/786542Dalam pengalaman saya, gridExtra: grid.arrange berfungsi dengan baik, jika Anda mencoba membuat plot dalam satu lingkaran.
Cuplikan Kode Pendek:
sumber
The
cowplot
paket memberi Anda cara yang baik untuk melakukan hal ini, dengan cara yang publikasi pakaian.sumber