Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ggplot2 y axis label decimal precision

Tags:

I am plotting several ggplot charts in a loop (i know, i know don't loop use plyr...but) and was curious if there was a way to set the decimal precision to say one decimal (i.e. 0.0). I am using the following scale transformation.

p <- p + scale_y_log10()

Any help would be appreciated.

like image 263
MikeTP Avatar asked Apr 05 '12 20:04

MikeTP


1 Answers

I was kind of under the impression that one decimal (i.e 1.2) was the default, but if you're seeing more decimal places than that, you can pass your own formatting to the scale:

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))
}

And then add the scale to your plot:

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

Now that I think about this, I should add that if you're really going to write your own formatter, you should probably stick to using the format function to do the work, rather than rounding and coercing. That's probably safer and "nicer".

As an example, to force two digits after the decimal, you could change this formatting function to something like this:

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

and you can further play with the nsmall and digits arguments to format to get what you want, I think. An example of it's use:

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

like image 130
joran Avatar answered Sep 21 '22 15:09

joran