wake-up-neo.com

Gemeinsamer Haupttitel einer mit par (mfrow) kompilierten Figurentafel

Ich habe eine Zusammenstellung von 4 Plots zusammen mit par(mfrow=c(2,2)). Ich möchte einen gemeinsamen Titel für die beiden oberen Diagramme und einen gemeinsamen Titel für die beiden unteren Bedienfelder zeichnen, die zwischen den beiden linken und rechten Diagrammen zentriert sind.

Ist das möglich?

46
ECII

Dies sollte funktionieren, aber Sie müssen mit dem Argument line herumspielen, um es richtig zu machen:

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 steht für "Randtext". side = 3 Sagt, es am "oberen" Rand zu platzieren. Mit line = -21 Soll die Platzierung um 21 Zeilen verschoben werden. outer = TRUE Sagt, dass es in Ordnung ist, den äußeren Randbereich zu verwenden.

Um einen weiteren "Titel" oben hinzuzufügen, können Sie ihn beispielsweise mit mtext("My 'Title' in a strange place", side = 3, line = -2, outer = TRUE) hinzufügen.

46

Sie können die Funktion layout() verwenden und zwei Darstellungsbereiche festlegen, die in beiden Spalten vorkommen (siehe die sich wiederholenden Nummern 1 und 3 in der Funktion matrix()). Dann habe ich plot.new() und text() verwendet, um Titel zu setzen. Sie können mit Rändern und Höhen spielen, um eine bessere Darstellung zu erhalten.

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

32
Didzis Elferts

Das Gleiche, jedoch in Fettdruck, kann mit title(...) mit den gleichen Argumenten wie oben ausgeführt werden:

title("My 'Title' in a strange place", line = -21, outer = TRUE)
12
Ufos

Hier ist eine andere Möglichkeit, dies zu tun: Verwenden Sie die Funktion line2user Von dieser Beitrag .

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

Hier befindet sich der Titel 2 Zeilen höher als der obere Rand des Diagramms, wie durch line2user(2, 3) angegeben. Wir zentrieren es, indem wir es in Bezug auf die 2. und 4. Kurve um die Hälfte der kombinierten Breite des linken und rechten Randes versetzen, d. H. mean(par('mar')[c(2, 4)]).


line2user Drückt einen Versatz (Anzahl der Linien) von einer Achse in Benutzerkoordinaten aus und ist wie folgt definiert:

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))
}
7
jbaums