Label klip cowplot ketika diplot dengan y ›1 pada beberapa plot

Pertama, beberapa grafik tiruan:

df <- data.frame(x = 1:10, y = 2:11)

Karena grafik saya yang sebenarnya cukup rumit, saya tidak akan menyajikannya di sini, tetapi akan menggunakan grafik lain yang mereproduksi masalah tersebut. Cukuplah untuk mengatakan bahwa ketika align disetel ke "hv" di plot_grid, itu menciptakan banyak ruang kosong di antara grafik saya. Untuk memperbaikinya, saya mengatur margin pada plot asli seperti ini:

library(ggplot2)

plot1 <- ggplot(df, aes(x = x, y = y)) +
  geom_point() + 
  theme(plot.margin = unit(c(-1, 0, 0, 0), "cm"))
plot2 <- ggplot(df, aes(x = y, y = -x)) +
  geom_point() + 
  theme(plot.margin = unit(c(-1, 0, 0, 0), "cm"))
plot3 <- ggplot(df, aes(x = x, y = y)) +
  geom_point() + 
  theme(plot.margin = unit(c(-1, 0, 0, 0), "cm"))
plot4 <- ggplot(df, aes(x = y, y = -x)) +
  geom_point() + 
  theme(plot.margin = unit(c(-1, 0, 0, 0), "cm"))

Yang memanjangkan bagian atas plot sehingga memenuhi ruang putih. Semuanya bagus dan keren (dalam contoh ini, mungkin ada sedikit tumpang tindih antara bagian atas dan bawah):

library(cowplot)

plot5 <- plot_grid(plot1, plot2, plot3, plot4, nrow = 2, ncol = 2, 
                   align = "hv")
plot5

Sampai saya mencoba menambahkan label. Karena saya telah memperluas plotnya, saya ingin menambahkan label lebih tinggi dari batas y = 1.

plot5 <- plot_grid(plot1, plot2, plot3, plot4, nrow = 2, ncol = 2, 
                   align = "hv", labels = c("A", "B", "C", "D"), 
                 label_x = 0.1,
                 label_y = 1.15)+
  theme(plot.margin = unit(c(3, 1, 1, 1), "cm"))
plot5

Mengembalikan peringatan ini:

Removed 1 rows containing missing values (geom_text).  

masukkan deskripsi gambar di sini

Artinya dua label paling atas dilepas, meskipun tampaknya ada cukup ruang. Jadi, saya pikir, mungkin margin plot baru diterapkan setelah label diplot, atau mungkin kliping menyebabkan masalah. Jadi, saya melakukan ini:

plot5 <- plot_grid(plot1, plot2, plot3, plot4, nrow = 2, ncol = 2, 
                   align = "hv") + 
  theme(plot.margin = unit(c(3, 0, 0, 0), "cm")) +
  coord_cartesian(clip = "off")

plot5 + 
  draw_plot_label(c("A", "B", "C", "D"), c(0, 0.5, 0, 0.5), c(1.1, 1.1, .5, .5))   

masukkan deskripsi gambar di sini Yang mengembalikan kesalahan yang sama seperti sebelumnya, meskipun, seperti yang Anda lihat, ada lebih banyak ruang yang tersedia di bagian atas plot. Sebagai upaya terakhir, saya juga mematikan kliping di plot aslinya, tetapi itu juga tidak memperbaiki apa pun, misalnya:

plot1 <- ggplot(df, aes(x = x, y = y)) +
  geom_point() + 
  theme(plot.margin = unit(c(-1, 0, 0, 0), "cm")) + 
  coord_cartesian(clip = "off")

Masalahnya hanya terjadi ketika saya merencanakan melewati y = 1. y = 1.01 menyebabkan masalah, misalnya. Bagaimana cara memperbaiki masalah ini? Sepertinya masalah yang cukup sederhana, kecuali ada masalah dengan ggplot atau cowplot.


person Grubbmeister    schedule 23.01.2019    source sumber
comment
Bukan jawaban - Baru-baru ini saya mengalami masalah banyak ruang kosong di sekitar plot tunggal menggunakan plot_grid, menggunakan perpustakaan egg alih-alih cowplot menyelesaikan masalah tanpa harus menyesuaikan margin, dll.   -  person erc    schedule 24.01.2019
comment
Terima kasih atas tipnya! Akan memeriksanya.   -  person Grubbmeister    schedule 24.01.2019
comment
Saya tidak tahu persis di mana Anda ingin menempatkan label tersebut. y = 1 menurut definisi adalah bagian atas area plot untuk plot tersebut, dan angka di atas 1 akan berada di luar area plot. Jika Anda melihat kode untuk cowplot::plot_grid, ia memanggil cowplot::ggdraw dengan batas defaultnya c(0, 1) untuk x dan y untuk membuat plotnya, dan selanjutnya menggunakan scale_x_continuous dan scale_y_continuous dengan batas tersebut. Label diplot menggunakan batasan tersebut, jadi berdasarkan aturan ggplot standar, apa pun di luarnya akan dihapus.   -  person Nick Kennedy    schedule 12.02.2019
comment
Masalah yang saya alami adalah spasi - terlalu banyak antar plot. Jadi saya memperluas plotnya. Ini memperbaiki spasi di tengah grid, namun mendorong plot teratas ke batas y=1. Jadi, ketika saya membuat plot pada labelnya, label tersebut berada di atas plot. Oleh karena itu saya harus membuat plot melewati y=1, yang tidak mungkin dilakukan, bahkan jika Anda menambahkan margin ekstra di seluruh grid.   -  person Grubbmeister    schedule 12.02.2019


Jawaban (2)


Dengan mengikuti saran untuk menggunakan paket 'telur', saya memperbaiki masalahnya: menghapus spasi di antara grafik dan memberi label pada plot dengan cara yang masuk akal.

Selain itu, perlu diperhatikan bahwa telur tampak lebih cepat daripada plot sapi dalam menggambar plot.

install.packages("egg")
library(egg)

df <- data.frame(x = 1:10, y = 2:11)

plot1 <- ggplot(df, aes(x = x, y = y)) +
  geom_point() + 
  theme(plot.margin = unit(c(0, 0, 0, 0), "cm"))
plot2 <- ggplot(df, aes(x = y, y = -x)) +
  geom_point() + 
  theme(plot.margin = unit(c(0, 0, 0, 0), "cm"))
plot3 <- ggplot(df, aes(x = x, y = y)) +
  geom_point() + 
  theme(plot.margin = unit(c(0, 0, 0, 0), "cm"))
plot4 <- ggplot(df, aes(x = y, y = -x)) +
  geom_point() + 
  theme(plot.margin = unit(c(0, 0, 0, 0), "cm"))

figure <- egg::ggarrange(plot1, plot2, 
         plot3, plot4, 
             nrow = 2,ncol=2,
             labels=c("A", "B", "C","D"),
             label.args = list(gp=gpar(font=2), x=unit(.5,"line")))
figure

masukkan deskripsi gambar di sini

person Grubbmeister    schedule 11.02.2019

Oke, jadi saya punya jawaban, yang memperbaiki masalah label, tetapi tidak menyelesaikan masalah karena tidak dapat memplot melewati y=1. Alih-alih mengurangi margin atas pada plot asli, saya mengurangi margin bawah:

plot1 <- ggplot(df, aes(x = x, y = y)) +
  geom_point() + 
  theme(plot.margin = unit(c(1, 0, -1, 0), "cm"))
plot2 <- ggplot(df, aes(x = y, y = -x)) +
  geom_point() + 
  theme(plot.margin = unit(c(1, 0, -1, 0), "cm"))
plot3 <- ggplot(df, aes(x = x, y = y)) +
  geom_point() + 
  theme(plot.margin = unit(c(1, 0, -1, 0), "cm"))
plot4 <- ggplot(df, aes(x = y, y = -x)) +
  geom_point() + 
  theme(plot.margin = unit(c(1, 0, -1, 0), "cm"))

plot5 <- plot_grid(plot1, plot2, plot3, plot4, nrow = 2, ncol = 2, 
                   align = "hv", labels = c("A", "B", "C", "D"), 
                   label_x = 0.1,
                   label_y = 1) +
  theme(plot.margin = unit(c(1, 1, 2, 1), "cm"))
plot5

Yang memungkinkan saya menempatkan label di tempat yang masuk akal. masukkan deskripsi gambar di sini

Namun, masih tidak masuk akal bagi saya mengapa labelnya terpotong (dan tampaknya juga terjadi ketika y‹0).

person Grubbmeister    schedule 23.01.2019