Một nhược điểm của các giải pháp dựa trên grid.arrange
là chúng gây khó khăn cho việc dán nhãn các ô bằng chữ cái (A, B, v.v.), như hầu hết các tạp chí yêu cầu.
Tôi đã viết gói cowplot để giải quyết vấn đề này (và một vài vấn đề khác), cụ thể là chức năng plot_grid()
:
library(cowplot)
iris1 <- ggplot(iris, aes(x = Species, y = Sepal.Length)) +
geom_boxplot() + theme_bw()
iris2 <- ggplot(iris, aes(x = Sepal.Length, fill = Species)) +
geom_density(alpha = 0.7) + theme_bw() +
theme(legend.position = c(0.8, 0.8))
plot_grid(iris1, iris2, labels = "AUTO")
Đối tượng plot_grid()
trả về là một đối tượng ggplot2 khác và bạn có thể lưu nó ggsave()
như bình thường:
p <- plot_grid(iris1, iris2, labels = "AUTO")
ggsave("plot.pdf", p)
Ngoài ra, bạn có thể sử dụng chức năng cowplot save_plot()
, đó là một trình bao bọc mỏng xung quanh ggsave()
giúp dễ dàng có được kích thước chính xác cho các ô kết hợp, ví dụ:
p <- plot_grid(iris1, iris2, labels = "AUTO")
save_plot("plot.pdf", p, ncol = 2)
(Đối ncol = 2
số cho biết save_plot()
rằng có hai ô cạnh nhau và save_plot()
làm cho hình ảnh được lưu rộng gấp đôi.)
Để biết mô tả sâu hơn về cách sắp xếp các ô trong lưới, hãy xem họa tiết này. Ngoài ra còn có một họa tiết giải thích làm thế nào để tạo ra âm mưu với một huyền thoại được chia sẻ.
Một điểm thường gặp của sự nhầm lẫn là gói cowplot thay đổi chủ đề ggplot2 mặc định. Gói này hoạt động theo cách đó bởi vì ban đầu nó được viết cho sử dụng trong phòng thí nghiệm nội bộ và chúng tôi không bao giờ sử dụng chủ đề mặc định. Nếu điều này gây ra vấn đề, bạn có thể sử dụng một trong ba cách tiếp cận sau để khắc phục chúng:
1. Đặt chủ đề theo cách thủ công cho mọi âm mưu. Tôi nghĩ rằng đó là cách thực hành tốt để luôn chỉ định một chủ đề cụ thể cho từng cốt truyện, giống như tôi đã làm + theme_bw()
trong ví dụ trên. Nếu bạn chỉ định một chủ đề cụ thể, chủ đề mặc định không thành vấn đề.
2. Hoàn nguyên chủ đề mặc định trở lại mặc định ggplot2. Bạn có thể làm điều này với một dòng mã:
theme_set(theme_gray())
3. Gọi các chức năng cowplot mà không đính kèm gói. Bạn cũng không thể gọi library(cowplot)
hoặc require(cowplot)
thay vào đó gọi các chức năng cowplot bằng cách trả trước cowplot::
. Ví dụ: ví dụ trên sử dụng chủ đề mặc định ggplot2 sẽ trở thành:
## Commented out, we don't call this
# library(cowplot)
iris1 <- ggplot(iris, aes(x = Species, y = Sepal.Length)) +
geom_boxplot()
iris2 <- ggplot(iris, aes(x = Sepal.Length, fill = Species)) +
geom_density(alpha = 0.7) +
theme(legend.position = c(0.8, 0.8))
cowplot::plot_grid(iris1, iris2, labels = "AUTO")
Cập nhật:
- Kể từ cowplot 1.0, chủ đề ggplot2 mặc định không bị thay đổi nữa.
- Kể từ ggplot2 3.0.0, các ô có thể được dán nhãn trực tiếp, xem ví dụ ở đây.