2013-02-02 13 views
39

Mam kompilację 4 działek narysowanych razem z par(mfrow=c(2,2)). Chciałbym narysować wspólny tytuł dla 2 powyższych działek i wspólny tytuł dla 2 poniższych paneli, które są wyśrodkowane pomiędzy 2 lewymi i prawymi działkami.Wspólny tytuł główny panelu rysunku skompilowany za pomocą par (mfrow)

Czy to możliwe?

+0

Doing że rodzaj przesłaniać „title”, prawda? Dlaczego nie chcesz, aby był na szczycie wszystkich fabuł? – A5C1D2H2I1M1N2O1R2T1

+0

Co mam na myśli, to jeden tytuł dla 2 górnych działek i jeden tytuł dla 2 niższych działek. Poprawiłem moją Q – ECII

Odpowiedz

34

Ten powinien praca, ale trzeba się bawić z line argumentu, aby to po prostu prawo:

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 oznacza "tekst marginesu". side = 3 mówi, aby umieścić go na górnym marginesie. line = -21 mówi, aby zrównoważyć umieszczenie o 21 linii. outer = TRUE mówi, że można użyć obszaru marginesu zewnętrznego.

Aby dodać kolejny „tytuł” ​​u góry, można go dodać za pomocą powiedzmy mtext("My 'Title' in a strange place", side = 3, line = -2, outer = TRUE)

+1

Fantastic. Dziękuję Ci. Nie wiedziałem, że 'mtext' może używać wartości ujemnych. – ECII

+0

+1 za "Mój" tytuł "w dziwnym miejscu" ... – ECII

+2

@ECII, bez problemu. Ogólnie rzecz biorąc, myślę, że podchodziłbyś do tego za pomocą "layoutu", jak wykazano w odpowiedzi @ Didzis'a. – A5C1D2H2I1M1N2O1R2T1

31

Można użyć funkcji layout() i ustawić dwa kreślenia regiony, które występuje w obu kolumnach (patrz powtarzające się numery 1 i 3 w matrix()). Następnie użyłem plot.new() i text() do ustawienia tytułów. Możesz grać z marginesami i wysokościami, aby uzyskać lepszą reprezentację.

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

Dostajesz mój głos tutaj. Myślę, że 'layout' jest zdecydowanie do zrobienia, ale chciał też pokazać opcję' mtext'. – A5C1D2H2I1M1N2O1R2T1

10

To samo ale pogrubione można zrobić za pomocą title(...) z tych samych argumentów jak powyżej:

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

Oto kolejny sposób to zrobić, korzystając z funkcji line2user z 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

Tutaj tytuł ustawiony 2 linie wyższa niż górna krawędź działki, o czym świadczy line2user(2, 3). Wyśrodkowujemy ją, kompensując ją w odniesieniu do 2. i 4. poletka, o połowę łącznej szerokości lewego i prawego marginesu, tj. mean(par('mar')[c(2, 4)]).


line2user wyraża przesunięcie (liczbę linii) od osi współrzędnych w użytkownika i jest zdefiniowany jako:

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

Przyjemna jedna @ jbaums – Skiptoniam