2016-02-20 6 views
10

Ich habe eine gerahmte Handlung mit einem Titel. Ich habe mich gefragt, ob es eine schnelle und einfache Möglichkeit gibt, auch einen Rahmen um den (Haupt-) Titel der Handlung zu legen.Setzen Sie einen Rahmen um den Titel in einem generischen R-Diagramm

Der Rahmen sollte die gleiche Breite wie der Rahmen um das Diagramm haben. Gibt es auch eine Möglichkeit, die Höhe des Rahmens anzupassen?

Ich würde gerne an der generischen Plot-Funktion bleiben.

# Some example data 
x <- rnorm(10) 
y <- rnorm(10) 

# Plot data and add title 
plot(x,y, 
    xlab = "", 
    ylab = "", 
    frame = TRUE 
    ) 
title(main = "This should be framed") 

Vielen Dank und ein schönes Wochenende an alle!

Antwort

12

Eine Möglichkeit ist die Verwendung rect.

Verwenden Sie zuerst par("usr"), um "die Extrema der Benutzerkoordinaten der Zeichenregion" zu erhalten.

Weil Sie mögen, dass der „Rahmen die gleiche Breite wie der Rahmen rund um das Grundstück haben sollte“, sind die x-Positionen einfach: Verwenden Sie den ersten und zweiten Wert der ‚user-Koordinaten‘ als xleft und xright.

Die unteren und oberen Positionen des rect erfordern etwas mehr Arbeit. Die y-Position des title "ist standardmäßig vertikal zentriert in (äußerem) Rand 3" (?title). Verwenden Sie par("mai"), um die Ränder in Zoll zu erhalten. Berechnen Sie den Mittelpunkt des oberen y-Rands, indem Sie Rand 3 durch 2 teilen (par("mai")[3]/2). Definieren Sie eine Höhe des Rahmens z. 0,5, was in der Mitte zwischen der Mitte des Titels und der Grenze der Figurenregion bzw. der Zeichenregion entspricht.

Um von Inch zu Benutzerkoordinaten zu konvertieren, verwenden Sie grconvertY. Das heißt, wir multiplizieren den Wert in Zoll mit diff(grconvertY(y = 0:1, from = "inches", to = "user")) (siehe z.B. here). Dieser Wert wird dann zur oberen Benutzerkoordinate von y (coord[4]) hinzugefügt.

coord <- par("usr") 
y_mid <- par("mai")[3]/2 
height <- 0.5 
conv <- diff(grconvertY(y = 0:1, from = "inches", to = "user")) 

rect(xleft = coord[1], 
    xright = coord[2], 
    ybottom = coord[4] + (y_mid * (1 - height) * conv), 
    ytop = coord[4] + (y_mid * (1 + height) * conv), 
    xpd = TRUE) 

enter image description here

3

Das Gitter Graphical System hat viel bessere Möglichkeiten für Handling Units, so würde ich das gridBase Paket zu verwenden versucht sein, "Schritt in" ein grafisches System, in dem die Form und Position des Rechtecks ​​können direkter benannt werden. Hier ist, was das aussehen könnte:

library(grid) 
library(gridBase) 

## Standard idiom for setting your frame of reference to be that of the base R plot's frame 
lapply(baseViewports(), pushViewport) 
## Draw a rectangle centered 2 lines above frame and 1.5 lines of text in height 
grid.rect(y = unit(1,"npc") + unit(2, "lines"), 
      height = unit(1.5, "lines"), just = "center") 

enter image description here

Im Gegensatz zu Henriks Basis R Lösung, dies erfordert, dass Sie nicht für jede Handlung von Hand hantieren, zu experimentieren, bis Sie das Rechteck des y-Koordinaten nur erhalten Recht.

+0

Was für eine Erleichterung, eine nicht fest codierte Alternative zu sehen! +1 – Henrik

+0

@ Henrik Vielen Dank! 'grconvertX()' und 'grconvertY()' können * fast * Sie zu einer nicht-hartcodierten Basis-R-Lösung bringen, aber es fehlt (soweit ich das sehe) jedes Verständnis von 'Linien' als Längeneinheit, also Es ist einfacher, einfach einen seitlichen Schritt in die ** Grid ** - Welt zu machen. –

+0

@ Henrik Nizza finden. Danke für die Bearbeitung, um es hinzuzufügen. –

Verwandte Themen