¿Trazar una leyenda fuera del área de trazado en los gráficos base?
Como dice el título: ¿Cómo puedo trazar una leyenda fuera del área de trazado cuando uso gráficos base?
Pensé en trastear layout
y producir un gráfico vacío que solo contenga la leyenda, pero me interesaría encontrar una forma de usar solo las funciones del gráfico base y, por ejemplo, par(mar = )
obtener algo de espacio a la derecha del gráfico 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 dije, me gustaría que la leyenda estuviera fuera del área de trazado (por ejemplo, a la derecha del gráfico/trazado).
Nadie ha mencionado el uso inset
de valores negativos para legend
. Aquí hay un ejemplo, donde la leyenda está a la derecha del gráfico, alineada hacia 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")
Es posible que sea necesario ajustar el primer valor de inset=c(-0.2,0)
según el ancho de la leyenda.
Quizás lo que necesita es par(xpd=TRUE)
permitir que se dibujen cosas fuera de la región de la trama. Entonces, si haces la trama principal, bty='L'
tendrás algo de espacio a la derecha para una leyenda. Normalmente, esto se recortaría en la región de la trama, pero hágalo par(xpd=TRUE)
y con un poco de ajuste podrá 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))