2015-05-27 17 views
5

Tôi đang cố gắng đặt tiêu đề cho một số biểu đồ ggplot2, trong khi để lại một số không có tiêu đề. Thật không may, khi tiêu đề được thiết lập, trục y và cốt truyện co lại (xem cốt truyện bên phải). Tôi cần vẽ tiêu đề mà không thay đổi kích thước trục Y, sao cho các biểu đồ có tiêu đề có cùng quy mô với các biểu đồ khác (như trong cốt truyện ở giữa).hiển thị tiêu đề ggplot2 mà không cần đặt chỗ cho nó

grid.arrange(
    (ggplot(mtcars, aes(mpg, hp)) + geom_point()), 
    (ggplot(mtcars, aes(mpg, hp)) + geom_point() + 
    geom_text(aes(22.5, 340, label="fake title", vjust = 1, hjust = .5, show_guide = FALSE))), 
    (ggplot(mtcars, aes(mpg, hp)) + geom_point() + 
    labs(title="real title")), 
    ncol=3) 

plot sample

tôi không thể sử dụng tiêu đề trống dây giả mạo trên mảnh đất khác, bởi vì tôi là ngắn hạn về không gian. Tôi có thể sử dụng phương pháp geom_text(), nếu có ai có thể cho tôi biết cách làm cho nó trông ít bị cắt xén. Vì vậy, làm thế nào để loại bỏ bất kỳ không gian dành riêng cho các tiêu đề trên cốt truyện, trong khi vẫn hiển thị tiêu đề cốt truyện trên và ở trên cùng của khu vực âm mưu? Loại thứ hai được thực hiện với theme(plot.title = element_text(vjust=-1)).)

+2

Thay vì 'geom_text', sử dụng' chú thích (geom = "text") ' – Gregor

+0

@Gregor: Tôi đã làm những gì bạn đề xuất, vì vậy nếu bạn có thể viết câu trả lời đó, tôi sẽ trả tiền. Nếu không, tôi sẽ đánh dấu câu trả lời của Matthew Plourde là được chấp nhận. –

Trả lời

2

Bạn nên sử dụng annotate cho việc này. Nếu bạn sử dụng geom_text, nó sẽ in bao nhiêu nhãn vì có các hàng trong dữ liệu của bạn, do đó, nhãn được tìm kiếm quá mức trông kém trong câu hỏi của bạn. Một công việc đau đớn xung quanh là tạo một khung dữ liệu 1 hàng để sử dụng làm dữ liệu cho lớp geom_text. Tuy nhiên, annotate là dành cho loại điều này, do đó bạn không cần một công việc xung quanh. Một cái gì đó như:

annotate(geom = "text", x = 22.5, y = 340, label="fake title") 

là phương pháp hay. Chú thích cũng hữu ích cho việc thêm các dòng ngang hoặc dọc duy nhất vào một ô, hoặc để làm nổi bật một vùng bằng cách vẽ một hình chữ nhật xung quanh nó.

3

Sửa Nhờ @baptiste để chỉ ra một cách ngắn gọn hơn để thực hiện điều này. Với p1, p2, và p3 từ bên dưới:

pl = lapply(list(p1,p2,p3), ggplotGrob) 
grid.newpage() 
grid.draw(do.call(cbind, c(pl, size="first"))) 

Original câu trả lời

Bạn có thể xây dựng các grobs ggplot và chuẩn hóa các thông số heights trên lô:

p1 <- ggplot(mtcars, aes(mpg, hp)) + geom_point() 
p2 <- ggplot(mtcars, aes(mpg, hp)) + geom_point() + labs(title="real title") 
p3 <- ggplot(mtcars, aes(mpg, hp)) + geom_point() + 
    geom_text(aes(22.5, 340, label="fake title", vjust = 1, hjust = .5, show_guide = FALSE)) 

p1 <- ggplot_gtable(ggplot_build(p1)) 
p2 <- ggplot_gtable(ggplot_build(p2)) 
p3 <- ggplot_gtable(ggplot_build(p3)) 

p2$heights <- p1$heights 
p3$heights <- p1$heights 

grid.arrange(p1, p2, p3, ncol=3) 

enter image description here

Sau đó bạn có thể sử dụng thiết lập của tiêu đề vjust để di chuyển nó ra khỏi những âm mưu hoặc thêm vào cốt truyện, nếu bạn muốn:

p2 <- ggplot(mtcars, aes(mpg, hp)) + geom_point() + 
    labs(title="real title") + 
    theme(plot.title=element_text(vjust=-.3)) 

enter image description here

+3

gtable phù hợp hơn grid.arrange, 'pl = lapply (danh sách (p1, p2, p3), ggplotGrob); grid.newpage(); grid.draw (do.call (cbind, c (pl, size = "first"))) '. Cũng lưu ý rằng 'chú thích()' sẽ tốt hơn so với geom_text vì hiện tại nó xếp chồng nhiều phiên bản của văn bản. – baptiste

+0

Cảm ơn, @baptiste. Tôi đã cập nhật câu trả lời để bao gồm đề xuất của bạn. –

Các vấn đề liên quan