2011-10-22 33 views
6

geom_smooth es excelente, en gran parte porque tiene una gran variación. Sin embargo, debido a esto, es difícil ver cómo varía en el eje x cuando se aleja. Estoy produciendo alrededor de 1000 gráficos donde necesito tener ggplot2 acercar a través de coord_cartesian. Sin embargo, cada gráfico tendría diferentes límites de zoom. ¿Hay alguna manera de pedirle al ggplot2 que haga un acercamiento para que se ajuste a la suavidad? Estoy interesado en las soluciones para ampliar la línea geom_smooth y geom_smooth line plus SE sombreada.ggplot2: hacer zoom sobre geom_smooth automáticamente (usando coord_cartesian)

Por ejemplo, yo estaría interesado en saber cómo podría convertir esto:

ggplot(data=mtcars, aes(y=qsec,x=wt)) + geom_point() + geom_smooth() 

en algo como esto:

ggplot(data=mtcars, aes(y=qsec,x=wt)) + geom_point() + geom_smooth() + coord_cartesian(ylim = c(15,20)) 

sin especificar explícitamente los límites.

+1

En la versión actual (0.89), es imposible. En la próxima versión, el dibujo se ajusta al rango calculado, por lo que si se hace 'ggplot (data = mtcars, aes (y = qsec, x = wt)) + geom_smooth()', entonces se ajusta automáticamente. – kohske

+0

Gracias, @kohske! Si pones tu comentario como respuesta lo aceptaré (puede que no te importe, pero podría hacerlo más fácil para los espectadores). ¿Esto funciona actualmente en la versión de desarrollo si tengo ganas de probarlo? –

+0

¡Esperamos la nueva versión! –

Respuesta

7

El ajuste manual de sus modelos de suavizado le ofrece mucha más flexibilidad para lograr este y otros tipos de personalización. Para la mayoría de los proyectos, empiezo usando la interfaz en línea, pero generalmente termino cambiando al cálculo manual cuando necesito otros ajustes.

Véase también el §9.1.1 en el libro de Hadley.

require(ggplot2) 

# Fit smooth manually 
fit = loess(qsec ~ wt, data=mtcars) 
newx = data.frame(wt=with(mtcars, seq(min(wt), max(wt), len=100))) 
pred = predict(fit, newdata=newx, se=T) 
pred = cbind(wt=newx, qsec=pred$fit, se=pred$se.fit) 

# Calculate limits based on extent of smooth geom 
ylims = with(pred, c(floor(min(qsec-se)), ceiling(max(qsec+se)))) 

# Plot 
dev.new(width=5, height=4) 
ggplot(data=mtcars, aes(y=qsec, x=wt)) + 
    geom_point() + 
    geom_smooth(aes(ymax=qsec+se, ymin=qsec-se), data=pred, stat='identity') + 
    coord_cartesian(ylim = ylims) 

enter image description here

Sin embargo, esto todavía no funciona para facetas porque sólo se puede especificar, por ejemplo, scales='free', y no a los límites reales directamente.

+0

genial, muchas gracias! Debo intentar unir las facetas conmigo mismo entonces. Me interesará ver cómo se mejora esto en la próxima versión. –

Cuestiones relacionadas