2013-03-05 10 views
12

Per qualche motivo la funzione che sto installando con ggplot2 si estende oltre l'asse y, anche se il valore minimo che è possibile ottenere è zero. Quindi, nel tentativo di limitare il limite inferiore a zero, ho notato che apparentemente non è possibile impostare solo il limite inferiore in modo tale che i punti dati siano omessi (o punti previsti, apparentemente). È vero?ggplot2 - imposta limite inferiore maggiore del punto più basso

Per esempio, si può usare expand_limits per diminuire, per così dire:

require(ggplot2) 
p = ggplot(mtcars, aes(wt, mpg)) + geom_point() 
p + expand_limits(y=0) 

Ma non si può ingrandire:

p + expand_limits(y=15) 

Stessa cosa con l'impostazione del estetica:

p + aes(ymin=0) 
p + aes(ymin=15) 

So che posso usare ylim, coord_cartesian, ecc. Per impostare sia il limite superiore e inferiore, ma in questo caso sto passando un elenco a ggplot utilizzando lapply e le modifiche del limite superiore in base a quale oggetto dell'elenco viene tracciato. Quindi sono tornato a tracciare ogni oggetto individualmente, il che è molto noioso. Qualche idea?

EDIT: Hadley conferma che questo non è possibile, quindi una soluzione alternativa di @Arun dovrà fare!

+0

I non riesco a trovarlo in questo momento, ma sono certo che questo è stato discusso sulla mailing list ggplot2. Il mio confuso ricordo è che alcune persone hanno avanzato l'idea di permettere di passare 'Inf' o' -Inf' a 'xlim' e' ylim', ma che l'implementazione effettiva era molto più complicata di quanto sembrava. – joran

+5

@jslefche, come soluzione, non puoi impostarlo come 'ylim (your_val, max (mtcars $ mpg))'? (quando fai un ciclo, puoi passare il valore massimo di quel dato ogni volta ..)? joran, sei sicuro che fosse per 'xlim' e non per' geom_rect'? – Arun

+1

@Arun So che Inf può essere usato in geom_rect, mi sento davvero come se mi ricordassi di questa stessa richiesta che appariva sulla mailing list, e alcune persone suggeriscono che sarebbe bello se potessi passare Inf e -Inf a xlim e ylim e poi Hadley o qualcuno che spiega che sarebbe bello, ma molto difficile da implementare. – joran

risposta

1

Dipende da come si desidera tracciare i grafici, ma se è possibile creare un vettore del limite superiore per ogni grafico si potrebbe fare qualcosa di simile ...

# Some vector of upper bounds for each plot which you can determine beforehand 
ul <- c(20,25,30,35) 
# Layout for printing plots (obviously you can handle this part however you like, this is just an example) 
vplayout <- function(x, y) viewport(layout.pos.row = x, layout.pos.col = y) 

# Make some sensible number of rows/columns for plot page 
x <- floor(sqrt(length(ul))) 
y <- ceiling(length(ul)/x) 

# Make list to hold plots 
plots <- as.list(1:length(ul)) 
dim(plots) <- c(x , y) 


# Store plots with variable upper limit variable each time 
for(i in plots){ 
     plots[[i]] <- ggplot(mtcars, aes(wt, mpg)) + geom_point() + scale_y_continuous(limits = c(15,ul[i]) , expand = c(0 , 0)) 
} 


# Print the plots 
grid.newpage() 
pushViewport(viewport(layout = grid.layout(x, y))) 
for(i in 1:x){ 
    for(j in 1:y){ 
     print(plots[[ i , j ]] , vp = vplayout(i , j)) 
     } 
    } 

enter image description here

+0

@jslefche È questo che speravi di fare? –

Problemi correlati