2012-09-24 16 views
6

Quiero trazar tres gráficos en un diseño de 1x3. Solo el primer gráfico necesita etiquetas de eje vertical, pero quiero que las tres áreas de trazado tengan exactamente el mismo tamaño. Esto no sería un problema si ninguno o todos los gráficos tenían etiquetas de eje. Pero, ¿cómo puedo obtener los tres gráficos del mismo tamaño cuando uno tiene etiquetas de eje y los otros dos no? Intento hacer esto en gráficos base porque eso es lo que mejor sé, pero me encantaría usar grid o ggplot2 si proporcionan mejores métodos para resolver mi problema.¿Cómo crear múltiples gráficos, cada uno con el mismo tamaño de área de trazado, cuando solo un gráfico tiene etiquetas de eje?

He aquí algunos datos falsos, mi código de trazado, y la trama en sí:

# Fake Data 
data = structure(list(y1 = 1:5, y2 = c(1.2, 2.4, 3.6, 4.8, 6), y3 = c(1.44, 
2.88, 4.32, 5.76, 7.2)), .Names = c("y1", "y2", "y3"), 
row.names = c("I needed 12 units for financial aid", 
       "I couldn't find any other open classes", 
       "I might be adding a major or minor", 
       "The class seemed interesting", "The class fit into my schedule" 
), class = "data.frame") 

# Plotting code 
par(mar=c(5,15,4,1)) 
par(mfrow=c(1,3)) 
barplot(data$y1,names.arg=row.names(data), horiz=TRUE,las=1, + 
     xlim=c(0,8), main="Group 1") 
par(mar=c(5,1,4,1)) 
barplot(data$y2,names.arg=row.names(data), horiz=TRUE,las=1, + 
     axisnames=FALSE, xlim=c(0,8), main="Group 2") 
barplot(data$y3,names.arg=row.names(data), horiz=TRUE,las=1, + 
     axisnames=FALSE, xlim=c(0,8), main="Group 3") 

# Reset plot options back to defaults 
par(mfrow=c(1,1) 
par(mar=c(5,4,4,2)+0.1) 

[Actualización: Me eligieron la respuesta que respondió más directamente a mi pregunta, que estaba en los gráficos de base, pero me recomiendan mirando las otras soluciones, así, ya que muestran cómo hacer lo mismo en lattice y ggplot2.]

enter image description here

Respuesta

8

Para gráficos de base que desea utilizar un margen exterior en lugar de los márgenes normales. Simplemente reemplace el primer par(mar=c(5,15,4,1)) con par(oma=c(0,15,0,0)) y elimine la segunda llamada al par y los trazados ocuparán el mismo espacio (y las etiquetas del eje se pegarán en el margen exterior de la izquierda).

+0

Cambiar la configuración 'oma' parece "reiniciar" el área de trazado. Por ejemplo, si hago el primer gráfico con 'oma = c (0,15,0,0)' y luego llamo a 'par (oma = c (0,0,0,0))' seguido de 'plot (. ..) ', termino con dos parcelas separadas, en lugar de dos parcelas en la misma" página ". ¿Hay alguna manera de decirle a R que mantenga el mismo área de trazado de 1x3 después del primer trazado, a pesar de que he llamado 'oma'? – eipi10

+0

@ eipi10 solo debe establecer el parámetro 'oma' una vez, no lo cambie entre cuadros individuales. –

+0

Eso funcionó, gracias. Por curiosidad, ¿por qué no tienes que restablecer 'oma' de nuevo a c (0,0,0,0) después de dibujar el primer diagrama?Además, para referencia futura, en la medida en que haya casos en los que se desee cambiar los parámetros gráficos entre parcelas, ¿hay alguna manera de evitar que R restablezca el área de trazado? – eipi10

6

pude pr obably pieza algo juntos utilizando layout, pero era más rápido que hacerlo utilizando la función de facetado de ggplot2:

data$grp <- rownames(data) 
datam <- melt(data,id.vars = "grp") 
ggplot(datam,aes(x = grp,y = value)) + 
    facet_wrap(~variable,nrow = 1) + 
    geom_bar(stat = "identity") + 
    coord_flip() 

enter image description here

7

La forma más fácil con los gráficos de base es, probablemente, para que se den sin las etiquetas del eje Y y luego agrega las etiquetas por separado en un panel adicional a la izquierda de las tres.

Pero tareas como esta son una de las razones por las que lattice (y ggplot, para el caso) fueron inventados. También podría considerar una gráfica de puntos, especialmente si es fan de William Cleveland.

library(reshape2) 
d2 <- data 
d2$q <- rownames(d2) 
d2 <- melt(d2, measure.vars=1:3, id.vars=4) 
d2$q <- factor(d2$q, levels=rownames(data)) 

library(lattice) 
barchart(q ~ value|variable, data=d2) 
dotplot(q ~ value|variable, data=d2) 

enter image description here enter image description here

4

Ampliando la respuesta de Greg nieve (a la luz de su pregunta de seguimiento) aquí es una edición mínima de su código que lo hace con los gráficos de base:

op <- par(oma=c(0,15,0,0), mfrow=c(1,3), mar=c(5,1,4,1)) 
barplot(data$y1,names.arg=row.names(data), horiz=TRUE,las=1, xlim=c(0,8), main="Group 1") 
barplot(data$y2,names.arg=row.names(data), horiz=TRUE,las=1, axisnames=FALSE, xlim=c(0,8), main="Group 2") 
barplot(data$y3,names.arg=row.names(data), horiz=TRUE,las=1, axisnames=FALSE, xlim=c(0,8), main="Group 3") 
par(op) 

la clave para evitar el "reset" se mencionar es asignar todos los parámetros en una sola llamada a par()

Cuestiones relacionadas