2012-08-23 2 views
7

Sto utilizzando ggplot per tracciare alcuni dati e ho notato che il testo delle legende è molto lungo e non si adatta alla finestra.avvolgimento del testo della legenda per adattarlo alla finestra del grafico

+ opts(legend.position = 'bottom', legend.direction = 'horizontal', size=0.1) + 
    guides(colour = guide_legend(nrow = 3), size=1) 

Esiste un'opzione in ggplot per avvolgere il testo della legenda per adattarlo alla finestra.

+2

buona domanda: un esempio * riproducibile * potrebbe velocizzare le risposte ... –

+2

Difficile pubblicare una risposta senza dati. Ma AFAIK non ha alcuna opzione in 'ggplot2', ma puoi scrivere una funzione per inserire' \ n'dopo una certa lunghezza. –

risposta

7

Non per quanto ne so, così ho fatto ricorso a una soluzione alternativa utilizzando strwidth(), che calcola la larghezza del testo nella grafica di base.

title <- "This is a really excessively wide title for a plot, especially since it probably won't fit" 

Usa par("din") to get the width of the device, and strwidth() `per calcolare la dimensione del testo:

par("din")[1] 
[1] 8.819444 
strwidth(title, units="inches") 
[1] 11.47222 

usarlo in una funzione e la trama:

wrapTitle <- function(x, width=par("din")[1]){ 
    xx <- strwrap(x, width=0.8 * nchar(x) * width/strwidth(x, units="inches")) 
    paste(xx, collapse="\n") 
} 

wrapTitle(title) 
[1] "This is a really excessively wide title for a plot, especially since it\nprobably won't fit, meaning we somehow have to wrap it" 

La trama:

ggplot(mtcars, aes(wt, mpg)) + geom_point() + opts(title=wrapTitle(title)) 

enter image description here


Se si desidera salvare la trama su file, quindi è possibile sostituire par("din") con l'attuale dimensione del tracciato salvato.

+0

Mi piace il tuo approccio, tuttavia, come ho capito, l'OP vuole racchiudere il testo della legenda non il titolo o il titolo della legenda. C'è un modo per conoscere le dimensioni del grob dove si trova il testo della legenda? –

+0

@ Iselzer Ahah, non stavo prestando abbastanza attenzione ... – Andrie