miércoles, 26 de agosto de 2009

Disposición de los gráficos

En el paquete UsingR tenemos la función gráfica simple.hist.and.boxplot que produce la figura que mostramos con el siguiente código:

> simple.hist.and.boxplot function (x, ...)
{

op <- par(no.readonly = TRUE)
on.exit(par(op))

layout(matrix(c(1, 2), 2, 1), heights = c(3, 1))
par(mai = c(1, 1, 1, 1)/2)
hist(x, xlab = FALSE, col = gray(0.95), yaxt = "n", ...)

rug(x)

boxplot(x, horizontal = TRUE)
}


Observemos especialmente que se trata de combinar dos gráficos, el histograma y el boxplot. Pero el detalle que queremos destacar en este artículo es la disposición de los gráficos.

Hay dos parámetros que sirven para disponer varios gráficos en una misma figura. Por ejemplo, en la figura del artículo Chiplot se han dibujado dos gráficos de dispersión en horizontal. Esto se consigue con la instrucción

oldpar <- par(mfrow = c(1,2))

El vector c(nr,nc) especifica el número de filas y de columnas y el parámetro mfrow su escritura (por filas). También hay un parámetro mfcol para escribir por columnas.

Recordar que la modificación de un parámetro es para toda la sesión, de manera que si queremos revertir el cambio debemos ejecutar

par(oldpar)

Sin embargo, estos parámetros sólo dibujan gráficos del mismo tamaño. ¿Cómo se consique una disposición como la del gráfico que encabeza este artículo?



La respuesta es la instrucción layout.

Básicamente, en la instrucción layout debemos especificar una matriz de números correlativos 1,2,... (puede incluir ceros) que indicarán el orden de escritura. Un cero dejará la posición en blanco. La ventaja es que podemos definir las alturas de las filas y las anchuras de las columnas.

Para lograr la disposición de la figura anterior hacemos

> mm <- matrix(c(1,2), nrow = 2)
> layout(mm, heights = c(3,1))


Observemos que la definición de las alturas es proporcional, es decir, el primer gráfico ocupará 3/(3+1) del total, mientras que el segundo 1/(3+1).

Otros detalles de la función layout los dejaremos para otro artículo.

1 comentario: