2015-08-18 24 views
6

Tôi đang cố gắng để âm mưu ngói, đặc biệt là trong một ma trận 2x3, ví dụ:Phân bổ không gian âm mưu bình đẳng cho tất cả của nhiều âm mưu với các trục chia sẻ

x <- seq(1, 10, by=.01) 
y <- 1/x 

prms<- 
    list(xlab=rep(c("", "x"), each=3), 
     ylab=rep(c("y", "", ""), 2), 
     xaxt=rep(c("n", "s"), each=3), 
     yaxt=rep(c("s", "n", "n"), 2), 
     mar=list(c(0 , 4.1, 4.1, 0), 
       c(0 , 0, 4.1, 0), 
       c(0 , 0, 4.1, 1.1), 
       c(5.1, 4.1, 0, 0), 
       c(5.1, 0, 0, 0), 
       c(5.1, 0, 0, 1.1))) 

par(mfrow=c(2, 3)) 
for (ii in 1:6){ 
    par(mar=prms$mar[[ii]]) 
    plot(x, y, type="l", lwd=2, 
     xlab=prms$xlab[ii], ylab=prms$lab[ii], 
     xaxt=prms$xaxt[ii], yaxt=prms$yaxt[ii]) 
} 

nào sản xuất:

enter image description here

Tôi đã chặn các lề và trục "bên trong" vì tất cả các đơn vị x (resp., y) đều giống nhau, vì vậy các trục như vậy sẽ không cần thiết. Tuy nhiên, như bạn có thể thấy, bằng cách ép các lề trên các ô bên trái và bên phải, tôi đã vô tình cho các ô giữa quá nhiều không gian (không rõ ràng, nhưng cùng một rắc rối gây ra sự cố ở trên cùng bên dưới hàng).

Trong đó có câu hỏi hóc búa. mfrow chỉ định không gian bằng nhau cho mỗi subplot (tức là, trục, lề, v.v.), không cho từng vùng ô. Làm cách nào tôi có thể thay đổi cách tiếp cận của mình để mỗi khu vực vẽ có kích thước bằng nhau, ceteris paribus (tức là, trục, v.v.) không thay đổi? Tôi nghĩ đến việc sử dụng layout, nhưng không thể nghĩ ra một cách lập trình tốt đẹp để đi về việc đảm bảo mọi thứ có biểu diễn bằng nhau.

+1

tôi rất thích một 'phương pháp base' cho phù hợp với mảnh đất khác ở dự án này, nhưng 'ggplot '(vv) các giải pháp có thể được hướng dẫn. – MichaelChirico

Trả lời

4

Bạn có thể đặt mar thành 0 và sử dụng oma để cung cấp kích thước của lề ngoài. Các trục được thêm vào các ô liên quan trong một vòng lặp. x chung và nhãn trục y được bổ sung với mtextouter = TRUE

par(mfrow = c(2, 3), 
    mar = c(0, 0, 0, 0), 
    oma = c(4, 4, 0.5, 0.5)) 

for (i in 1:6) { 
    plot(x, y, type = "l", axes = FALSE) 
    if (i %in% c(4, 5, 6)) 
    axis(side = 1) 
    if (i %in% c(1, 4)) 
    axis(side = 2) 
    box() 
    } 

mtext("x values", side = 1, outer = TRUE, line = 2.5) 
mtext("y values", side = 2, outer = TRUE, line = 2.5) 

enter image description here

Xem thêm How to create multiple plots, each with same plot area size, when only one plot has axis labels?

+0

Đó là một sự xấu hổ không có cách nào để nói một cái gì đó như 'trục (side = if (i %% 3 == 1) 2)' để làm cho điều này ngắn gọn hơn, nhưng dù sao này là tuyệt vời! đã học được rất nhiều, ví dụ: 'box' rất hay. – MichaelChirico

+1

Hiện tại, sử dụng hàm này: 'tile_axes <-function (n, M, N, ...) { nếu (n> (M-1) * N) do.call (" trục ", c (bên = 1, danh sách (...))); nếu (n %% N == 1) do.call ("trục", c (bên = 2, danh sách (...)))} ' – MichaelChirico

+0

@MichaelChirico Cảm ơn bạn đã phản hồi. Tốt mà bạn tìm thấy một cách để tránh hardcoding của chỉ số của lô cần có trục! – Henrik

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