Posizionamento della legenda, ggplot, relativo alla regione di tracciamento

Il problema qui è un po ‘ovvio, penso. Mi piacerebbe che la legenda fosse posizionata (bloccata) nell’angolo in alto a sinistra della “regione di tracciamento”. L’uso di c (0.1,0.13) ecc non è un’opzione per una serie di motivi.

C’è un modo per cambiare il punto di riferimento per le coordinate in modo che siano relative alla regione di tracciamento?

mtcars$cyl <- factor(mtcars$cyl, labels=c("four","six","eight")) ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + opts(legend.position = c(0, 1), title="Legend placement makes me sad") 

inserisci la descrizione dell'immagine qui

Saluti

Aggiornamento: gli opts sono stati deprecati. Utilizza invece il theme , come descritto in questa risposta.

Il posizionamento della guida si basa sulla regione del grafico (cioè, l’area riempita da grigio) per impostazione predefinita, ma la giustificazione è centrata. Quindi è necessario impostare la giustificazione in alto a sinistra:

 ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + opts(legend.position = c(0, 1), legend.justification = c(0, 1), legend.background = theme_rect(colour = NA, fill = "white"), title="Legend placement makes me happy") 

inserisci la descrizione dell'immagine qui

Se si desidera posizionare la guida sull’intera regione del dispositivo, è ansible modificare l’output del gtable:

 p <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + opts(legend.position = c(0, 1), legend.justification = c(0, 1), legend.background = theme_rect(colour = "black"), title="Legend placement makes me happy") gt <- ggplot_gtable(ggplot_build(p)) nr <- max(gt$layout$b) nc <- max(gt$layout$r) gb <- which(gt$layout$name == "guide-box") gt$layout[gb, 1:4] <- c(1, 1, nr, nc) grid.newpage() grid.draw(gt) 

inserisci la descrizione dell'immagine qui

Aggiornamento: gli opts sono stati deprecati. Utilizza invece il theme , come descritto in questa risposta.

Solo per espandere la risposta di kohske, quindi è un po ‘più completo per la prossima persona inciampare su di esso.

 mtcars$cyl <- factor(mtcars$cyl, labels=c("four","six","eight")) library(gridExtra) a <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + opts(legend.justification = c(0, 1), legend.position = c(0, 1), title="Legend is top left") b <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + opts(legend.justification = c(1, 0), legend.position = c(1, 0), title="Legend is bottom right") c <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + opts(legend.justification = c(0, 0), legend.position = c(0, 0), title="Legend is bottom left") d <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + opts(legend.justification = c(1, 1), legend.position = c(1, 1), title="Legend is top right") grid.arrange(a,b,c,d) 

inserisci la descrizione dell'immagine qui

Ho cercato una risposta simile. Ma ho scoperto che la funzione opts non fa più parte del pacchetto ggplot2. Dopo aver cercato ancora un po ‘di tempo, ho scoperto che si può usare il theme per fare qualcosa di simile a un’opzione. Quindi modificando questo thread, in modo da minimizzare il tempo degli altri.

Di seguito è riportato il codice simile scritto da nzcoops .

 mtcars$cyl <- factor(mtcars$cyl, labels=c("four","six","eight")) library(gridExtra) a <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + labs(title = "Legend is top left") + theme(legend.justification = c(0, 1), legend.position = c(0, 1)) b <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + labs(title = "Legend is bottom right") + theme(legend.justification = c(1, 0), legend.position = c(1, 0)) c <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + labs(title = "Legend is bottom left") + theme(legend.justification = c(0, 0), legend.position = c(0, 0)) d <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + labs(title = "Legend is top right") + theme(legend.justification = c(1, 1), legend.position = c(1, 1)) grid.arrange(a,b,c,d) 

Questo codice darà una trama esattamente simile.

Per espandere le risposte eccellenti qui sopra, se vuoi aggiungere padding tra la legenda e l’esterno della scatola, usa legend.box.margin :

 # Positions legend at the bottom right, with 50 padding # between the legend and the outside of the graph. theme(legend.justification = c(1, 0), legend.position = c(1, 0), legend.box.margin=margin(c(50,50,50,50))) 

Funziona sull’ultima versione di ggplot2 che è la v2.2.1 al momento della scrittura.