2016-02-20 10 views
10

Ho una trama con un titolo. Mi stavo chiedendo se c'è un modo semplice e veloce per mettere anche una cornice attorno al titolo (principale) della trama.Inserire una cornice attorno al titolo in una trama R generica

La cornice deve avere la stessa larghezza della cornice attorno al grafico. C'è anche un modo per regolare l'altezza della cornice?

Desidero attenermi alla funzione di stampa generica.

# 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") 

Mille grazie e un buon fine settimana a tutti!

risposta

12

Una possibilità è utilizzare rect.

Primo utilizzo par("usr") per ottenere "gli estremi delle coordinate utente dell'area di stampa".

perché si vuole che il "telaio dovrebbe avere la stessa larghezza della cornice attorno la trama", gli X-posizioni sono semplici: usare il primo e secondo valori della 'user coordinate' come xleft e xright.

Le posizioni inferiore e superiore dello rect richiedono un po 'più di lavoro. La posizione y di title "" ha il valore predefinito per essere centrato verticalmente nel margine (esterno) 3 "(?title). Utilizzare par("mai") per ottenere i margini in pollici. Calcola il punto medio del margine y superiore dividendo il margine 3 per 2 (par("mai")[3]/2). Definire un'altezza del telaio, ad es. 0,5, che corrisponde rispettivamente a metà strada tra il centro del titolo e il bordo della regione della figura e la regione del grafico.

Per convertire da pollici a coordinate utente, utilizzare grconvertY. Cioè, moltiplichiamo il valore in pollici per diff(grconvertY(y = 0:1, from = "inches", to = "user")) (vedi ad esempio here). Questo valore viene quindi aggiunto alla coordinata dell'utente superiore di y (coord[4]).

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

La griglia sistema grafico ha molto migliori strutture per unità di trattamento, così sarei tentato di utilizzare la gridBase pacchetto a "passaggio in" un sistema grafico in cui la la forma e la posizione del rettangolo possono essere nominate più direttamente. Ecco che cosa potrebbe essere simile:

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

A differenza di soluzione di base R di Henrik, questo non richiede di smanettare a mano per ogni appezzamento, sperimentando fino ad arrivare coordinate y del rettangolo appena destra.

+0

Che sollievo vedere un'alternativa non codificata! +1 – Henrik

+0

@ Henrik Grazie! 'grconvertX()' e 'grconvertY()' può * quasi * portarti a una soluzione di base R non hardcoded, ma mancano (per quanto posso vedere) di qualsiasi comprensione di 'lines' come unità di lunghezza, quindi è più facile fare un passo indietro su ** grid ** - world. –

+0

@ Henrik Bella scoperta. Grazie per la modifica per aggiungerlo. –

Problemi correlati