2012-05-25 19 views
43

El problema aquí es un poco obvio, creo. Me gustaría que la leyenda se coloque (bloqueada) en la esquina superior izquierda de la 'región de trazado'. Usar c (0.1.0.13) etc. no es una opción por varias razones.Colocación de leyenda, ggplot, relativo a la región de trazado

¿Hay alguna manera de cambiar el punto de referencia de las coordenadas para que estén relacionadas con la región de trazado?

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

enter image description here

Saludos

+0

¿Qué quiere decir con "región de trazado"? La región que está llena de gris? – kohske

+0

@kohske Sí, el OP básicamente quiere poder determinar las coordenadas correctas para 'legend.position' para colocar la leyenda en una esquina de la" región de datos ", o la región gris.Como mencioné en el chat, sospeché que alguien como tú tendría que sopesar con una solución de grilla. – joran

+0

@joran, ese es el comportamiento predeterminado y todo lo que necesita es establecer la justificación correcta. – kohske

Respuesta

42

Actualización: opts está desfasada. Por favor utilice theme lugar, como se describe in this answer.

La colocación de la guía se basa en la región de trama (es decir, la zona de llenado por gris) por defecto, pero justificación está centrado. por lo que necesita para establecer superior izquierda justificación:

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

enter image description here

Si desea colocar la guía contra toda la región del dispositivo, puede ajustar la salida 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) 

enter image description here

+0

gracias, no es 'duro arriba a la izquierda', pero ser equi distante de ambos 'bordes' va a hacer :) – nzcoops

+13

opts ha quedado en desuso. Use el tema en su lugar. – papirrin

+0

Esto produce un error: 'no se pudo encontrar la función' opta ''. –

56

Actualización: opts ha quedado obsoleto. Por favor, use theme lugar, tal como se describe in this answer.

Sólo para ampliar la respuesta de kohske, por lo que es poco más amplio para la siguiente persona que se tropiezan con él.

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) 

enter image description here

33

que han estado buscando respuesta similar. Pero descubrió que la función opts ya no forma parte del paquete ggplot2. Después de buscar algo más de tiempo, descubrí que uno puede usar theme para hacer algo similar a opts. Por lo tanto, editar este hilo, para minimizar el tiempo de los demás.

A continuación se muestra el código similar escrito por 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) 

Este código dará una trama exactamente similar.

4

Para ampliar las respuestas excelente con champaña anterior, si desea agregar relleno entre la leyenda y el exterior de la caja, utilice 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))) 

Esto funciona en la versión más reciente de ggplot2 que es v2. 2.1 al momento de escribir.

Cuestiones relacionadas