Bagaimana cara memperbaiki rasio aspek di ggplot?

89

Saya mencoba mengubah ukuran plot agar sesuai dengan dokumen saya, tetapi saya mengalami kesulitan membuat diagram plot menjadi persegi.

Contoh:

pdf(file = "./out.pdf", width = 5, height = 5)
p <- ggplot(mydata, aes(x = col1, y = col2))
print(p)
aux <- dev.off()

Meskipun batasan untuk x dan y sama, plot pada hasilnya bukanlah persegi. Saya rasa R membuat panel penutup 5x5 "tetapi tidak peduli dengan ukuran diagram sebenarnya.

Bagaimana saya bisa membatalkan diagram saya?

htorque.dll
sumber

Jawaban:

115

Dalam ggplotmekanisme untuk mempertahankan rasio aspek plot Anda adalah menambahkan coord_fixed()lapisan untuk plot. Ini akan mempertahankan rasio aspek plot itu sendiri, apa pun bentuk kotak pembatas yang sebenarnya.

(Saya juga menyarankan Anda menggunakan ggsaveuntuk menyimpan plot yang Anda hasilkan ke pdf / png / etc, daripada pdf(); print(p); dev.off()urutannya.)

library(ggplot2)
df <- data.frame(
    x = runif(100, 0, 5),
    y = runif(100, 0, 5))

ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()

masukkan deskripsi gambar di sini

Andrie
sumber
3
Tahukah Anda mengapa ggplot bersikeras untuk meletakkan label sumbu y di sebelah kiri? Saya ingin tahu bagaimana mencegahnya ...
Mengejar
@chase Solusi kludgy adalah mengubah hjustposisi judul - coba opts(axis.title.y=theme_text(hjust=10)). Tapi sayangnya, sepertinya tidak. Lihat groups.google.com/group/ggplot2/browse_thread/thread/… untuk diskusi milis ggplot dan jawaban @ Baptiste.
Andrie
3
Perilaku itu diperbaiki dalam versi pengembangan.
hadley
5
Dengan judul pertanyaan yang lebih umum, dapatkah Anda juga menambahkan informasi tentang cara menghitung rasio (argumen untuk coord_fixed) mengingat tidak menggunakan batas yang sama pada kedua sumbu?
htorque
1
Lebih lanjut untuk komentar @ htorque; jika y malah didefinisikan y=runif(100, 0, 50)maka aspek plot tidak lagi persegi. coord_fixed()menyebabkan skala setiap sumbu menjadi sama hanya yang terlihat?
ben yang berbeda
80

Untuk memastikan rasio aspek tertentu, misalnya untuk persegi, gunakan theme(aspect.ratio=1) .

Jawaban Andrie tidak memberikan gambaran yang lengkap, karena pada contoh tersebut terdapat data yang mungkin tidak wajar dimana range x sama dengan range y. Namun jika datanya:

df <- data.frame(
  x = runif(100, 0, 50),
  y = runif(100, 0, 5))
ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()

maka plotnya akan terlihat seperti ini:

masukkan deskripsi gambar di sini

Fungsi coord_fixed () juga memiliki argumen untuk menyesuaikan rasio sumbu:

ratio rasio aspek, dinyatakan sebagai y / x

Sehingga plot bisa dibuat persegi dengan:

ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed(ratio=10)

masukkan deskripsi gambar di sini

Tetapi Anda perlu menyesuaikan ini dengan batas variabel atau area plot (tidak semua batas dapat dibagi dengan baik dengan bilangan bulat seperti contoh ini).

ben yang berbeda
sumber
13

Demi kelengkapan: Jika Anda ingin mempertimbangkan batas sumbu yang sangat berbeda:

df <- data.frame(
  x = runif(100, 0, 5000),
  y = runif(100, 0, 5))
ratio.display <- 4/3
ratio.values <- (max(df$x)-min(df$x))/(max(df$y)-min(df$y))
plot <- ggplot(df, aes(x=x, y=y)) + geom_point()
plot + coord_fixed(ratio.values / ratio.display)

Yang menghasilkan:

Graipher
sumber
14
bagaimana itu lebih baik dari plot + theme(aspect.ratio=4/3)? Ggplot mungkin memiliki beberapa lapisan, dengan beberapa kumpulan data, dan sumbu mungkin memiliki faktor perluasan yang berubah-ubah, jadi menghitung rasio y / x dari satu sumber data tampaknya cukup rapuh.
baptiste
2
Karena ini rupanya tidak mudah ditemukan. Yang dibuktikan dengan adanya tiga jawaban di sini, tetapi tidak ada yang menyebutkannya. Anda harus memasukkannya ke dalam jawaban, ini pasti solusi yang lebih baik.
Graipher