2012-04-05 7 views
17

Sto tracciando diversi grafici ggplot in un ciclo (lo so, so che il ciclo non usa plyr ... ma) ed ero curioso di sapere se c'era un modo per impostare la precisione decimale per dire un decimale (cioè 0,0). Sto usando la seguente trasformazione di scala.ggplot2 etichetta con asse decimale precisione decimale

p <- p + scale_y_log10() 

Qualsiasi aiuto sarebbe apprezzato.

risposta

20

ero un po 'l'impressione che un decimale (ad esempio 1,2) è stato il default, ma se stai vedendo posti più decimali di questo, si può passare la propria formattazione alla scala:

fmt_dcimals <- function(decimals=0){ 
    # return a function responpsible for formatting the 
    # axis labels with a given number of decimals 
    function(x) as.character(round(x,decimals)) 
} 

E quindi aggiungere la scala al vostro diagramma:

ggplot(...) + scale_y_log10(labels = fmt_dcimals(2)) 

Ora che penso a questo, devo aggiungere che se siete veramente intenzione di scrivere il proprio formattatore, probabilmente si dovrebbe attenersi a utilizzando la funzione di format fai il lavoro, piuttosto che arrotondare e forzare. Probabilmente è più sicuro e "più bello".

A titolo di esempio, per costringere due cifre dopo la virgola, è possibile modificare la funzione di formattazione a qualcosa di simile:

fmt_dcimals <- function(decimals=0){ 
    function(x) format(x,nsmall = decimals,scientific = FALSE) 
} 

e si può inoltre giocare con gli argomenti nsmall e digits per format per ottenere ciò che vuoi, penso. Un esempio del suo utilizzo:

df <- data.frame(x = 1:5,y = rexp(5)) 
ggplot(df,aes(x = x,y=y)) + 
    geom_point() + 
    scale_y_log10(labels = fmt_dcimals(2)) 

enter image description here

+0

Grazie. Per coerenza nell'aspetto degli assi, vorrei avere sempre due decimali anche se il numero arrotonda uniformemente a un decimale. C'è un modo per fare in modo che la funzione round restituisca sempre due decimali (ad esempio round (22,50,2) restituisce 22,5 invece di 22,50)? – MikeTP

+0

@MikeTP Ci scusiamo per il ritardo. Penso che la mia modifica indirizzi la tua domanda. – joran

+0

perché hai una funzione all'interno di una funzione? – naught101