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.
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))
labels
argument to most scale_*
functions takes a function as a value. In the associated scales package you will find lots of formatting functions that actual return functions that are used to format labels. In short, wrapping it in fmt()
makes our code in scale_*
much more concise, compared to writing out the whole function as an argument to scale_*
- joran 2012-11-22 03:49
fmt<-function(x){format(x,nsmall = 2,scientific = FALSE)} ; ggplot(df,aes(x = x,y=y)) + scale_y_log10(labels = fmt)
? (note missing ()
from scale call). It does exactly the same thing, but it passes the function directly to ggplot, instead of passing a function that passes a function - naught101 2012-11-22 04:01
date_format
. If we do what you describe with that one, how do we pass different date formats along? Now consider an even more complicated example, like math_format
. So I was just sticking with the conventional format, that's all - joran 2012-11-22 08:59
partial
function from the pryr
package you can get similar behavior in much shorter code: labels = partial(sprintf, fmt = '%0.2f')
- Paul Hiemstra 2016-12-02 10:11