2013-02-02 22 views
39

Tôi có một bộ sưu tập gồm 4 ô được vẽ cùng với par(mfrow=c(2,2)). Tôi muốn vẽ một tiêu đề chung cho 2 ô trên và một tiêu đề chung cho 2 ô bên dưới được căn giữa 2 ô bên trái và bên phải.Tiêu đề chính chung của bảng điều khiển con số được biên soạn với mệnh đề (mfrow)

Điều này có khả thi không?

+0

Làm điều đó sẽ loại che khuất "title", phải không? Tại sao bạn không muốn nó ở trên cùng của tất cả các lô? – A5C1D2H2I1M1N2O1R2T1

+0

Ý tôi là một tiêu đề cho 2 ô trên và một tiêu đề cho 2 ô phía dưới. Tôi đã chỉnh sửa Q – ECII

Trả lời

34

này nên công việc, nhưng bạn sẽ cần để chơi xung quanh với lập luận line để có được nó vừa phải:

par(mfrow = c(2, 2)) 
plot(iris$Petal.Length, iris$Petal.Width) 
plot(iris$Sepal.Length, iris$Petal.Width) 
plot(iris$Sepal.Width, iris$Petal.Width) 
plot(iris$Sepal.Length, iris$Petal.Width) 
mtext("My 'Title' in a strange place", side = 3, line = -21, outer = TRUE) 

enter image description here

mtext đứng cho "văn bản lề". side = 3 cho biết đặt nó ở lề "trên cùng". line = -21 nói để bù đắp vị trí bằng 21 dòng. outer = TRUE cho biết bạn có thể sử dụng khu vực lề ngoài.

Để thêm một "danh hiệu" ở phía trên, bạn có thể thêm nó sử dụng, chẳng hạn, mtext("My 'Title' in a strange place", side = 3, line = -2, outer = TRUE)

+1

Fantastic của mình. Cảm ơn bạn. Tôi không biết rằng 'mtext' có thể sử dụng các giá trị âm. – ECII

+0

+1 cho "Tiêu đề của tôi" ở một nơi kỳ lạ "... – ECII

+2

@ECII, Không sao cả. Nói chung, mặc dù, tôi sẽ nghĩ rằng bạn sẽ tiếp cận điều này bằng cách sử dụng 'layout', như được minh họa trong câu trả lời của @ Didzis. – A5C1D2H2I1M1N2O1R2T1

31

Bạn có thể sử dụng chức năng layout() và thiết lập hai vùng âm mưu đó xảy ra trong cả hai cột (xem số lặp lại 1 và 3 trong số matrix()). Sau đó, tôi đã sử dụng plot.new()text() để đặt tiêu đề. Bạn có thể chơi với lề và chiều cao để có được đại diện tốt hơn.

x<-1:10 
par(mar=c(2.5,2.5,1,1)) 
layout(matrix(c(1,2,3,4,1,5,3,6),ncol=2),heights=c(1,3,1,3)) 
plot.new() 
text(0.5,0.5,"First title",cex=2,font=2) 
plot(x) 
plot.new() 
text(0.5,0.5,"Second title",cex=2,font=2) 
hist(x) 
boxplot(x) 
barplot(x) 

enter image description here

+5

Bạn nhận được phiếu bầu của tôi ở đây. Tôi nghĩ rằng 'layout' chắc chắn là con đường để đi, nhưng cũng muốn hiển thị tùy chọn' mtext'. – A5C1D2H2I1M1N2O1R2T1

10

Cùng nhưng in đậm có thể được thực hiện bằng title(...) với những lập luận tương tự như trên:

title("My 'Title' in a strange place", side = 3, line = -21, outer = TRUE) 
6

Dưới đây là một cách khác để làm điều đó, bằng cách sử dụng line2user chức năng từ this post.

par(mfrow = c(2, 2)) 
plot(runif(100)) 
plot(runif(100)) 
text(line2user(line=mean(par('mar')[c(2, 4)]), side=2), 
    line2user(line=2, side=3), 'First title', xpd=NA, cex=2, font=2) 

plot(runif(100)) 
plot(runif(100)) 
text(line2user(line=mean(par('mar')[c(2, 4)]), side=2), 
    line2user(line=2, side=3), 'Second title', xpd=NA, cex=2, font=2) 

centered_titles

Ở đây, danh hiệu được định vị cao hơn mép trên của cốt truyện 2 dòng, như được chỉ ra bởi line2user(2, 3). Chúng tôi căn giữa nó bằng cách bù đắp nó với các ô thứ 2 và thứ 4, bằng một nửa chiều rộng kết hợp của lề trái và lề phải, tức là mean(par('mar')[c(2, 4)]).


line2user thể hiện một offset (số dòng) từ một trục trong sử dụng tọa độ, và được định nghĩa là:

line2user <- function(line, side) { 
    lh <- par('cin')[2] * par('cex') * par('lheight') 
    x_off <- diff(grconvertX(0:1, 'inches', 'user')) 
    y_off <- diff(grconvertY(0:1, 'inches', 'user')) 
    switch(side, 
     `1` = par('usr')[3] - line * y_off * lh, 
     `2` = par('usr')[1] - line * x_off * lh, 
     `3` = par('usr')[4] + line * y_off * lh, 
     `4` = par('usr')[2] + line * x_off * lh, 
     stop("side must be 1, 2, 3, or 4", call.=FALSE)) 
} 
+0

Đẹp nhất @jbaums – Skiptoniam

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