2011-10-22 9 views
6

geom_smooth è grande, in gran parte perché fa una grande variazione. Tuttavia, a causa di ciò, è difficile vedere come varia sull'asse x quando viene rimpicciolito. Sto producendo circa 1000 grafici in cui ho bisogno di avere lo zoom ggplot2 via coord_cartesian. Tuttavia, ogni grafico avrebbe diversi limiti di zoom. C'è un modo che posso chiedere a ggplot2 di ingrandire per adattarsi al liscio? Sono interessato a soluzioni sia per lo zoom avanti sulla linea geom_smooth sia per la linea geom_smooth più l'area ombreggiata SE.ggplot2 - zoomando su geom_smooth automaticamente (usando coord_cartesian)

Per esempio, sarei interessato a sapere come avrei potuto trasformare questo:

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

in qualcosa di simile a questo:

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

senza specificare esplicitamente i limiti.

+1

Nella versione corrente (0,89), è impossibile. Nella prossima versione, il disegno è adattato all'intervallo calcolato, quindi se si eseguirà 'ggplot (data = mtcars, aes (y = qsec, x = wt)) + geom_smooth()', quindi adattato automaticamente. – kohske

+0

Grazie, @kohske! Se metti il ​​tuo commento come risposta lo accetto (potrebbe non interessarti ma potrebbe renderlo più semplice per gli spettatori). Funziona attualmente nella versione di sviluppo se ho voglia di provarlo? –

+0

In attesa della nuova versione! –

risposta

7

L'adattamento manuale dei modelli di livellamento offre molta più flessibilità per raggiungere questo e altri tipi di personalizzazione. Per la maggior parte dei progetti, inizio usando l'interfaccia in-line, ma di solito finisco per dover passare al calcolo manuale quando ho bisogno di altre modifiche.

Vedere anche § 9.1.1 nel libro di 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

Tuttavia, questo ancora non funziona per sfaccettature perché è possibile specificare solo, per esempio, scales='free', e non gli attuali limiti direttamente.

+0

cool, grazie mille! Potrei dover provare a unire le sfaccettature insieme, allora. Sarò interessato a vedere come questo è migliorato nella prossima versione. –

Problemi correlati