Como dice el título: ¿Cómo puedo trazar una leyenda fuera del área de trazado cuando uso gráficos básicos?
Pensé en jugar layout
y producir una trama vacía para contener solo la leyenda, pero me interesaría de alguna manera usar solo las instalaciones del gráfico base y, por ejemplo, par(mar = )
obtener algo de espacio a la derecha de la trama para 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 se dijo, me gustaría que la leyenda esté fuera del área de trazado (por ejemplo, a la derecha del gráfico / diagrama).
Respuestas:
Quizás lo que necesita es
par(xpd=TRUE)
permitir que las cosas se dibujen fuera de la región de la trama. Entonces, si haces la trama principalbty='L'
, tendrás un espacio a la derecha para una leyenda. Normalmente, esto se recortaría en la región de la trama, pero hazlopar(xpd=TRUE)
y con un poco de ajuste puedes obtener una leyenda lo más a la derecha posible:fuente
par(xpd=NA)
es aún más poderosa (es decir, parcelas en más regiones).par
llamada separada justo antes de la leyenda. En mi argumento, utilicépar(new=T)
en varias otras ocasiones y simplemente quería agregar elxpd
parámetro en la misma llamada, lo que causa problemas.Nadie ha mencionado el uso de
inset
valores negativos paralegend
. Aquí hay un ejemplo, donde la leyenda está a la derecha del diagrama, alineada a la parte superior (usando la palabra clave"topright"
).El primer valor de
inset=c(-0.2,0)
podría necesitar un ajuste basado en el ancho de la leyenda.fuente
xpd
debe establecerse enTRUE
para que funcione el recuadro negativo. Pero a veces no. Con el comandoargs.legend=list(x="bottom", horiz=TRUE, inset=-0.2)
dentro de unbarplot(...
no parece necesitar,xpd=TRUE
pero con sololegend(x="bottom", horiz=TRUE, inset=-0.2)
parece necesitarxpd=TRUE
. Alguna idea? ¿Estoy confundido al pasar mis argumentos?Otra solución, además de las ondes ya mencionadas (usando
layout
opar(xpd=TRUE)
) es superponer su trama con una trama transparente sobre todo el dispositivo y luego agregarle la leyenda.El truco consiste en superponer un gráfico (vacío) sobre el área de trazado completa y agregarle la leyenda. Podemos usar la
par(fig=...)
opción. Primero le indicamos a R que cree una nueva trama sobre todo el dispositivo de trazado:Configuración
oma
ymar
es necesaria 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. Luego podemos agregar el diagrama vacío:Y estamos listos para agregar la leyenda:
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 debemos 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;
Y un ejemplo. Primero cree la trama asegurándose de que tengamos suficiente espacio en la parte inferior para agregar la leyenda:
Luego agrega la leyenda
Resultando en:
fuente
Perdón por resucitar un hilo viejo, pero hoy tuve el mismo problema. La forma más simple que he encontrado es la siguiente:
Encontrado aquí: http://www.harding.edu/fmccown/R/
fuente
Me gusta hacerlo así:
El único ajuste requerido es establecer el margen correcto para que sea lo suficientemente ancho como para acomodar la leyenda.
Sin embargo, esto también se puede automatizar:
fuente
Recientemente encontré una función muy fácil e interesante para imprimir leyendas fuera del área de la trama donde quieras.
Haga el margen exterior en el lado derecho de la trama.
Crea una trama
Agregue la leyenda y simplemente use la función de localización (1) como se muestra a continuación. Luego debe hacer clic donde desee después de cargar el siguiente script.
Intentalo
fuente
Solo puedo ofrecer un ejemplo de la solución de diseño ya señalada.
fuente
Agregar otra alternativa simple que es bastante elegante en mi opinión.
Su trama:
Leyenda:
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 la trama en direcciones (x, y). En este caso la leyenda está en"bottomright"
posición. Se mueve por 0 regiones de trazado en la dirección x (por lo que permanece en "derecha") y por 1 región de trazado en la dirección y (de abajo hacia arriba). Y sucede que aparece justo encima de la trama.xpd=TRUE
- dejemos que la leyenda aparezca fuera de la región de trazado.horiz=TRUE
- da instrucciones para producir una leyenda horizontal.bty="n"
- Un detalle de estilo para deshacerse del cuadro delimitador de leyendas.Lo mismo se aplica al agregar la leyenda al lado:
Aquí simplemente ajustamos las posiciones de la leyenda y agregamos espacio de margen adicional al lado derecho de la gráfica. Resultado:
fuente
Puede hacer esto con la API Plotly R , ya sea con código 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 aquí .
Puede colocar la leyenda fuera del gráfico asignando uno de los valores x e y a 100 o -100.
Aquí están las otras opciones:
list("x" = 100, "y" = 0)
para exterior derecho inferiorlist("x" = 100, "y"= 1)
Exterior derecho superiorlist("x" = 100, "y" = .5)
Exterior derecho mediolist("x" = 0, "y" = -100)
Bajo izquierdalist("x" = 0.5, "y" = -100)
Bajo centrolist("x" = 1, "y" = -100)
Bajo derechoEntonces 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
browseURL(response$url)
para que abra su gráfico en su navegador.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.
fuente
Pruebe
layout()
lo que he usado para esto en el pasado simplemente creando una gráfica vacía a continuación, ajustada adecuadamente a aproximadamente 1/4 y colocando las partes de la leyenda manualmente en ella.Aquí hay algunas preguntas anteriores sobre
legend()
cuáles deberían ayudarlo a comenzar.fuente