tutorial studio r plot

studio - scale r plot



Evite desperdiciar espacio al colocar múltiples parcelas alineadas en una página (4)

Aquí hay una pequeña modificación de la trama general que muestra, suponiendo que las etiquetas de los ejes yy x pertenecen a todos los trazados. Utiliza un margen exterior para contener el etiquetado del eje, que se agrega con title() usando argumento outer = TRUE . El efecto es algo así como el etiquetado en ggplot2 o parcelas de celosía .

La línea clave aquí es:

op <- par(mfrow = c(2,2), oma = c(5,4,0,0) + 0.1, mar = c(0,0,1,1) + 0.1)

que establece los parámetros de trazado (los valores en su lugar antes de la llamada se almacenan en op ). Usamos 5 y 4 líneas en los lados 1 y 2 para el margen exterior, que es el número habitual para el parámetro mar . Trace los márgenes de la región ( mar ) de 1 línea cada uno, se agregan a los lados superior y derecho, para dar un poco de espacio entre las parcelas.

Las etiquetas de eje se agregan después del ciclo for() con

title(xlab = "Some Categories", ylab = "Some Values", outer = TRUE, line = 3)

El guion completo es:

set.seed(42) catA <- factor(c("m100", "m500", "m1000", "m2000", "m3000", "m5000")) catB <- factor(20:28) samples <- 100 rsample <- function(v) v[ceiling(runif(samples, max=length(v)))] Tab <- data.frame(catA = rsample(catA), catB = rsample(catB), valA = rnorm(samples, 150, 8), valB = pmin(1,pmax(0,rnorm(samples, 0.5, 0.3)))) op <- par(mfrow = c(2,2), oma = c(5,4,0,0) + 0.1, mar = c(0,0,1,1) + 0.1) for (i in 0:3) { x <- Tab[[1 + i %% 2]] plot(x, Tab[[3 + i %/% 2]], axes = FALSE) axis(side = 1, at=1:nlevels(x), labels = if (i %/% 2 == 1) levels(x) else FALSE) axis(side = 2, labels = (i %% 2 == 0)) box(which = "plot", bty = "l") } title(xlab = "Some Categories", ylab = "Some Values", outer = TRUE, line = 3) par(op)

que produce

Me gustaría colocar cuatro tramas en una sola página. Las etiquetas del eje deben imprimirse solo en el mismo borde, es decir, las etiquetas del eje x solo para los diagramas inferiores y las etiquetas del eje y sólo para los diagramas izquierdos. Esto se aplica tanto al nombre del eje como un todo como a las marcas individuales. Puedo generar algo a lo largo de estas líneas usando el siguiente código:

pdf(file = "ExampleOutput.pdf", width = 6.61, height = 6.61, pointsize = 10 ) set.seed(42) catA <- factor(c("m100", "m500", "m1000", "m2000", "m3000", "m5000")) catB <- factor(20:28) samples <- 100 rsample <- function(v) v[ceiling(runif(samples, max=length(v)))] Tab <- data.frame(catA = rsample(catA), catB = rsample(catB), valA = rnorm(samples, 150, 8), valB = pmin(1,pmax(0,rnorm(samples, 0.5, 0.3)))) par(mfrow = c(2,2)) for (i in 0:3) { x <- Tab[[1 + i %% 2]] plot(x, Tab[[3 + i %/% 2]], xlab = if (i %/% 2 == 1) "Some Categories" else NULL, ylab = if (i %% 2 == 0) "Some Values" else NULL, axes = FALSE ) axis(side = 1, at=1:nlevels(x), labels = if (i %/% 2 == 1) levels(x) else FALSE) axis(side = 2, labels = (i %% 2 == 0)) box(which = "plot", bty = "l") } par(mfrow = c(1,1)) dev.off()

Recibiré sugerencias sobre cómo mejorar mis comandos de ploteo, quizás evite dibujar los ejes y la L en la esquina inferior izquierda manualmente. Pero eso es solo un más.

El resultado de esta secuencia se ve así:

El problema aquí es la gran cantidad de espacios en blanco desperdiciados. Tengo la impresión de que R reserva espacio para las etiquetas de eje y tic, incluso si no se utilizan. Como consecuencia de este espacio desperdiciado, para el diagrama inferior izquierdo, solo cada segundo x tick realmente se etiqueta, lo cual es realmente malo aquí.

Me gustaría generar una trama similar sin mucho espacio en blanco. Las parcelas reales deben ser del mismo tamaño, por lo que se alinean correctamente, pero el espacio para las etiquetas debe ser solo en el exterior. Me imagino un diseño como este (maqueta creada en GIMP):

¿Cómo puedo lograr tal diseño?


Basándome en gran medida en la respuesta de Gavin Simpson , ahora uso la siguiente solución:

par(mfrow = c(2, 2), # 2x2 layout oma = c(2, 2, 0, 0), # two rows of text at the outer left and bottom margin mar = c(1, 1, 0, 0), # space for one row of text at ticks and to separate plots mgp = c(2, 1, 0), # axis label at 2 rows distance, tick labels at 1 row xpd = NA) # allow content to protrude into outer margin (and beyond)

El resultado es así:

Como puede ver, esto es suficiente para permitir la impresión de todas las etiquetas de tictac también. Si no fuera así, entonces, de acuerdo con el comentario de Gavin , agregar cex.axis con un valor menor que 1 a la lista de parámetros debería ayudar a reducir el tamaño de la fuente allí.


Necesita una evaluación condicional que asigne valores par(''mar'') que sean apropiados para el posicionamiento; Aquí hay un ejemplo de código (dentro de su bucle) que busca la "posición x-layout":

pdf(file = "ExampleOutput2.pdf", width = 6.61, height = 6.61, pointsize = 10 ) set.seed(42) catA <- factor(c("m100", "m500", "m1000", "m2000", "m3000", "m5000")) catB <- factor(20:28) samples <- 100 rsample <- function(v) v[ceiling(runif(samples, max=length(v)))] Tab <- data.frame(catA = rsample(catA), catB = rsample(catB), valA = rnorm(samples, 150, 8), valB = pmin(1,pmax(0,rnorm(samples, 0.5, 0.3)))) par(mfrow = c(2,2), mar= c(3, 4, 1, 1) + 0.1) for (i in 0:3) { x <- Tab[[1 + i %% 2]] plot(x, Tab[[3 + i %/% 2]], mar= if(i %/%2 == 0) {c(4, 4, 1, 1) + 0.1 }else{c(1, 1, 1, 1) + 0.1}, xlab = if (i %/% 2 == 1) "Some Categories" else NULL, ylab = if (i %% 2 == 0) "Some Values" else NULL, axes = FALSE ) axis(side = 1, at=1:nlevels(x), labels = if (i %/% 2 == 1) levels(x) else FALSE) axis(side = 2, labels = (i %% 2 == 0)) box(which = "plot", bty = "l") } par(mfrow = c(1,1)) dev.off()

Tendrá que ajustar esto para que se adapte a sus necesidades, ya que solo maneja dos condiciones de margen y usted realmente tiene 4 condiciones separadas (2 debajo de las que necesitan más espacio inferior, con la derecha necesitando menos espacio de la izquierda y dos arriba (también con requisitos diferentes). Si reduce globalmente el valor ''mar'', cortará sus etiquetas xey, como se puede ver en la pérdida de los valores xlab cuando solo suelta este código en su ciclo.


Simplemente manipule sus parámetros, en el par . El argumento mar controla el tamaño del margen para la gráfica individual. Cambia tu par a esto:

par(mfrow = c(2,2), mar=c(1, 4, 1, 1) + 0.1)#it goes c(bottom, left, top, right)