varias superponer studio modificar lineas graficos grafico graficas ejes dispersion r plot legend

studio - superponer graficas en r



¿Trazar una leyenda fuera del área de trazado en gráficos base? (10)

Como dice el título: ¿Cómo puedo trazar una leyenda fuera del área de trazado cuando uso gráficos base?

Pensé en juguetear con el layout y producir una trama vacía para contener solo la leyenda, pero me interesaría una forma de usar solo las funciones del gráfico base y, par(mar = ) ejemplo, par(mar = ) para obtener un poco de espacio a la derecha de la trama por la leyenda

Aquí un ejemplo:

plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2)) lines(1:3, rnorm(3), pch = 2, lty = 2, type="o") legend(1,-1,c("group A", "group B"), pch = c(1,2), lty = c(1,2))

produce:

Pero como dije, me gustaría que la leyenda esté fuera del área de trazado (por ejemplo, a la derecha del gráfico / trazado).


Agregando otra alternativa simple que es bastante elegante en mi opinión.

Tu plan:

plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2)) lines(1:3, rnorm(3), pch = 2, lty = 2, type="o")

Leyenda:

legend("bottomright", c("group A", "group B"), pch=c(1,2), lty=c(1,2), inset=c(0,1), xpd=TRUE, horiz=TRUE, bty="n" )

Resultado:

Aquí solo se agregó la segunda línea de la leyenda a su ejemplo. En turno:

  • inset=c(0,1) - mueve la leyenda por fracción de la región de trazado en (x, y) direcciones. En este caso, la leyenda está en la posición "bottomright" . Se mueve 0 trazando las regiones en la dirección x (por lo que se mantiene a la "derecha") y en 1 trazando la región en la dirección y (de abajo hacia arriba). Y sucede que aparece justo encima de la trama.
  • xpd=TRUE - vamos a ver la leyenda fuera de la región de trazado.
  • horiz=TRUE - instruye para producir una leyenda horizontal.
  • bty="n" : un detalle de estilo para eliminar el recuadro delimitador de leyenda.

Lo mismo se aplica cuando se agrega leyenda a un lado:

par(mar=c(5,4,2,6)) plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2)) lines(1:3, rnorm(3), pch = 2, lty = 2, type="o") legend("topleft", c("group A", "group B"), pch=c(1,2), lty=c(1,2), inset=c(1,0), xpd=TRUE, bty="n" )

Aquí simplemente ajustamos las posiciones de leyenda y agregamos espacio de margen adicional en el lado derecho de la gráfica. Resultado:


Me gusta hacerlo así:

par(oma=c(0, 0, 0, 5)) plot(1:3, rnorm(3), pch=1, lty=1, type="o", ylim=c(-2,2)) lines(1:3, rnorm(3), pch=2, lty=2, type="o") legend(par(''usr'')[2], par(''usr'')[4], bty=''n'', xpd=NA, c("group A", "group B"), pch=c(1, 2), lty=c(1,2))

El único ajuste requerido es establecer que el margen derecho sea lo suficientemente ancho para acomodar la leyenda.

Sin embargo, esto también se puede automatizar:

dev.off() # to reset the graphics pars to defaults par(mar=c(par(''mar'')[1:3], 0)) # optional, removes extraneous right inner margin space plot.new() l <- legend(0, 0, bty=''n'', c("group A", "group B"), plot=FALSE, pch=c(1, 2), lty=c(1, 2)) # calculate right margin width in ndc w <- grconvertX(l$rect$w, to=''ndc'') - grconvertX(0, to=''ndc'') par(omd=c(0, 1-w, 0, 1)) plot(1:3, rnorm(3), pch=1, lty=1, type="o", ylim=c(-2, 2)) lines(1:3, rnorm(3), pch=2, lty=2, type="o") legend(par(''usr'')[2], par(''usr'')[4], bty=''n'', xpd=NA, c("group A", "group B"), pch=c(1, 2), lty=c(1, 2))


Nadie ha mencionado el uso de valores de inset negativos para la legend . Aquí hay un ejemplo, donde la leyenda está a la derecha de la gráfica, alineada con la parte superior (usando la palabra clave "topright" ).

# Random data to plot: A <- data.frame(x=rnorm(100, 20, 2), y=rnorm(100, 20, 2)) B <- data.frame(x=rnorm(100, 21, 1), y=rnorm(100, 21, 1)) # Add extra space to right of plot area; change clipping to figure par(mar=c(5.1, 4.1, 4.1, 8.1), xpd=TRUE) # Plot both groups plot(y ~ x, A, ylim=range(c(A$y, B$y)), xlim=range(c(A$x, B$x)), pch=1, main="Scatter plot of two groups") points(y ~ x, B, pch=3) # Add legend to top right, outside plot region legend("topright", inset=c(-0.2,0), legend=c("A","B"), pch=c(1,3), title="Group")

El primer valor de inset=c(-0.2,0) podría necesitar un ajuste basado en el ancho de la leyenda.


Otra solución, además de las ya mencionadas (usando layout o par(xpd=TRUE) ) es superponer su trazado con un trazado transparente en todo el dispositivo y luego agregar la leyenda a eso.

El truco es superponer un gráfico (vacío) sobre el área de trazado completo y agregar la leyenda a eso. Podemos usar la opción par(fig=...) . Primero instruimos a R para que cree una nueva trama sobre todo el dispositivo de trazado:

par(fig=c(0, 1, 0, 1), oma=c(0, 0, 0, 0), mar=c(0, 0, 0, 0), new=TRUE)

Establecer oma y mar es necesario ya que queremos que el interior de la trama cubra todo el dispositivo. new=TRUE es necesario para evitar que R inicie un nuevo dispositivo. Entonces podemos agregar el diagrama vacío:

plot(0, 0, type=''n'', bty=''n'', xaxt=''n'', yaxt=''n'')

Y estamos listos para agregar la leyenda:

legend("bottomright", ...)

agregará una leyenda en la parte inferior derecha del dispositivo. Del mismo modo, podemos agregar la leyenda al margen superior o derecho. Lo único que tenemos que asegurar es que el margen de la trama original sea lo suficientemente grande como para acomodar la leyenda.

Poniendo todo esto en una función;

add_legend <- function(...) { opar <- par(fig=c(0, 1, 0, 1), oma=c(0, 0, 0, 0), mar=c(0, 0, 0, 0), new=TRUE) on.exit(par(opar)) plot(0, 0, type=''n'', bty=''n'', xaxt=''n'', yaxt=''n'') legend(...) }

Y un ejemplo. Primero crea la trama asegurándote de tener suficiente espacio en la parte inferior para agregar la leyenda:

par(mar = c(5, 4, 1.4, 0.2)) plot(rnorm(50), rnorm(50), col=c("steelblue", "indianred"), pch=20)

Luego agrega la leyenda

add_legend("topright", legend=c("Foo", "Bar"), pch=20, col=c("steelblue", "indianred"), horiz=TRUE, bty=''n'', cex=0.8)

Resultando en:


Perdón por resucitar un hilo viejo, pero hoy tuve el mismo problema. La forma más sencilla que he encontrado es la siguiente:

# Expand right side of clipping rect to make room for the legend par(xpd=T, mar=par()$mar+c(0,0,0,6)) # Plot graph normally plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2)) lines(1:3, rnorm(3), pch = 2, lty = 2, type="o") # Plot legend where you want legend(3.2,1,c("group A", "group B"), pch = c(1,2), lty = c(1,2)) # Restore default clipping rect par(mar=c(5, 4, 4, 2) + 0.1)

Encontrado aquí: http://www.harding.edu/fmccown/R/


Pruebe el layout() que he usado para esto en el pasado simplemente creando un gráfico vacío debajo, correctamente escalado alrededor de 1/4 aproximadamente y colocando manualmente las partes de leyenda.

Aquí hay algunas preguntas más antiguas sobre la legend() que deberían ayudarte a comenzar.


Puede hacer esto con la API Plotly R , con cualquiera de los códigos, o desde la GUI arrastrando la leyenda a donde lo desee.

Aquí hay un ejemplo. El gráfico y el código también están here .

x = c(0,1,2,3,4,5,6,7,8) y = c(0,3,6,4,5,2,3,5,4) x2 = c(0,1,2,3,4,5,6,7,8) y2 = c(0,4,7,8,3,6,3,3,4)

Puede colocar la leyenda fuera del gráfico asignando uno de los valores xey a 100 o -100.

legendstyle = list("x"=100, "y"=1) layoutstyle = list(legend=legendstyle)

Estas son las otras opciones:

  • list("x" = 100, "y" = 0) para Outside Right Bottom
  • list("x" = 100, "y"= 1) Exterior Derecha Arriba
  • list("x" = 100, "y" = .5) Fuera del centro derecho
  • list("x" = 0, "y" = -100) Bajo la izquierda
  • list("x" = 0.5, "y" = -100) En el centro
  • list("x" = 1, "y" = -100) Bajo la Derecha

Entonces la respuesta.

response = p$plotly(x,y,x2,y2, kwargs=list(layout=layoutstyle));

Plotly devuelve una URL con su gráfico cuando realiza una llamada. Puede acceder a eso más rápidamente llamando a browseURL(response$url) para que abra su gráfico en su navegador por usted.

url = response$url filename = response$filename

Eso nos da este gráfico. También puede mover la leyenda desde la GUI y luego el gráfico se escalará en consecuencia. Divulgación completa: estoy en el equipo de Plotly.


Recientemente encontré una función muy fácil e interesante para imprimir leyendas fuera del área de la trama donde lo desee.

Haga el margen exterior en el lado derecho de la trama.

par(xpd=T, mar=par()$mar+c(0,0,0,5))

Crea un diagrama

plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2)) lines(1:3, rnorm(3), pch = 2, lty = 2, type="o")

Agregue leyenda y simplemente use la función de localizador (1) como a continuación. Luego debe hacer clic donde desee después de cargar el siguiente script.

legend(locator(1),c("group A", "group B"), pch = c(1,2), lty = c(1,2))

Intentalo


Solo puedo ofrecer un ejemplo de la solución de diseño ya señalada.

layout(matrix(c(1,2), nrow = 1), widths = c(0.7, 0.3)) par(mar = c(5, 4, 4, 2) + 0.1) plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2)) lines(1:3, rnorm(3), pch = 2, lty = 2, type="o") par(mar = c(5, 0, 4, 2) + 0.1) plot(1:3, rnorm(3), pch = 1, lty = 1, ylim=c(-2,2), type = "n", axes = FALSE, ann = FALSE) legend(1, 1, c("group A", "group B"), pch = c(1,2), lty = c(1,2))


Tal vez lo que necesita es par(xpd=TRUE) para permitir que las cosas se par(xpd=TRUE) fuera de la región de trazado. Entonces, si haces la trama principal con bty=''L'' , tendrás un espacio a la derecha para una leyenda. Normalmente, esto se recortaría en la región de trazado, pero se par(xpd=TRUE) y con un poco de ajuste se puede obtener una leyenda lo más a la derecha posible:

set.seed(1) # just to get the same random numbers par(xpd=FALSE) # this is usually the default plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2), bty=''L'') # this legend gets clipped: legend(2.8,0,c("group A", "group B"), pch = c(1,2), lty = c(1,2)) # so turn off clipping: par(xpd=TRUE) legend(2.8,-1,c("group A", "group B"), pch = c(1,2), lty = c(1,2))