2010-11-17 13 views
5

Tengo un gráfico principal y otra información secundaria que quiero mostrar en otro gráfico debajo de ella. Facetear funciona muy bien, excepto que no sé cómo controlar el espacio relativo utilizado por una faceta frente a otra. Soy consciente de que space = 'free', pero esto solo es útil si los rangos corresponden al tamaño relativo deseado.Ajustar el espacio relativo de las facetas (sin tener en cuenta el espacio de coordenadas)

Así, por ejemplo, es posible que desee un gráfico donde la primera faceta ocupa el 80% y el segundo 20%. Aquí hay un ejemplo:

data <- rbind(
    data.frame(x=1:500, y=rnorm(500,sd=1), type='A'), 
    data.frame(x=1:500, y=rnorm(500,sd=5), type='B')) 
ggplot() + 
    geom_line(aes(x=x, y=y, colour=type), data=data) + 
    facet_grid(type ~ ., scale='free_y') 

Lo anterior crea 2 facetas de igual dimensión vertical. Al agregar space='free' en la función facet_grid, las dimensiones cambian de tal forma que la cara inferior es aproximadamente 5 veces más grande que la superior (como se esperaba).

Supongamos que quiero que la parte superior sea 2 veces mayor, con el mismo conjunto de datos y el mismo orden de facetas. ¿Cómo puedo lograr esto?

¿Es la única forma de hacer esto con algún truco al volver a escalar el conjunto de datos y anular manualmente las etiquetas de los ejes (y si es así, cómo)?

Alternativa

Como se indica a continuación pueden utilizar las ventanas gráficas para rendir como múltiples gráficos. Había considerado esto y de hecho lo había implementado usando este enfoque en el pasado con gráficos y ventanas estándar.

El problema es que es muy difícil hacer que el eje X se alinee con este enfoque. Entonces, si hay una forma de de arreglar el tamaño de la región de la etiqueta del eje y y el tamaño de la región de la leyenda, puede producir 2 gráficos que tengan el mismo área de representación.

+0

Debería haber indicado, pero necesito que el eje x se alinee con precisión. La representación en gráficos separados es algo considerado, pero no sería tan difícil conseguir que el eje x se alinee. Esto es importante ya que mira los indicadores coincidentes en una serie temporal. –

Respuesta

7

No necesita utilizar facetas para esto; también puede hacerlo utilizando la función viewport.

> ratio = 1/3 
> v1 = viewport(width=1,height=ratio,y=1-ratio/2) 
> v2 = viewport(width=1,height=1-ratio,y=(1-ratio)/2) 
> print(qplot(1:10,11:20,geom="point"),vp=v1) 
> print(qplot(1:10,11:20,geom="line"),vp=v2) 

Proporción es la proporción del panel superior con respecto a toda la página. Pruebe 2/3 y 4/5 también.

Este enfoque puede poner feo si su leyenda o etiquetas de los ejes de las dos parcelas de diferentes tamaños, pero para una revisión, ver la función align.plots en el paquete y ggplot2 autor ggExtra Hadley Wickam de notes on this very topic.

alt text


No hay manera fácil de hacer esto con facetas en la actualidad, aunque si usted está dispuesto a bajar a editing the Grid, puede modificar el gráfico ggplot después de que se ha trazado para conseguir este efecto.


Consulte también esta pregunta en using grid and ggplot2 to create join plots using R.

+0

Esas no son realmente 'facetas', ¿o sí? – Shane

+0

No puede hacer lo que quiera con las facetas sin bajar al nivel de la Grilla. Además, es probable que los datos secundarios utilicen una dimensión diferente de los datos, por lo que pueden no ser apropiados en muchos casos. –

+0

"¿Es la única forma de hacer esto con algún truco al volver a escalar el conjunto de datos y anular manualmente las etiquetas de los ejes (y si es así, cómo)?" - No, esta no es la única forma de hacerlo :-) –

Cuestiones relacionadas