Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to accurately display SI prefix for numbers in y-axis scale of plot made with ggplot2 in R?

Tags:

r

ggplot2

prefix

I have the following plot, generated using this code

plt <- ggplot(d2, aes_string(x=names(same_df)[1],y= "value")) + 
    geom_point(aes(color = variable), size = 1)+ theme_bw()+
    theme(legend.text=element_text(size=14), legend.title=element_text(size=14))+
    theme(axis.text=element_text(size=20)) +
    theme(axis.title=element_text(size=20,face="bold")) + scale_color_discrete(name = "title", labels = c("1", "2", "3", "4","5","6","7","8","9")) + labs(x = "x", y = "y")+ guides(colour = guide_legend(override.aes = list(size=4),ncol=2,title.hjust=0.5))+theme(plot.margin=unit(c(0,0,0,0),"mm"))

enter image description here

However I need SI prefix notation for the numbers in the y-axis, to get that I did the following steps,

library("sos")

To use the findFn in sitools package

findFn("{SI prefix}") 

Then I use the f2si in the labels to convert a floating point number number to number with a SI prefix

plt2 <- plt + scale_y_continuous(labels=f2si)

The resulting plot looks like this,

enter image description here

While the f2si accurately changed the y axis for -1e^-0.8 to -10 n, it does not accurately display the value for 0 and 1e^-0.8 which would be 0 and 10 n respectively. Could someone please suggest what should be corrected here so that the numbers are displayed as they should be throughout.

Thanks.

like image 700
Amm Avatar asked Jan 10 '14 13:01

Amm


People also ask

How do I change the Y axis scale in ggplot2?

Use scale_xx() functions It is also possible to use the functions scale_x_continuous() and scale_y_continuous() to change x and y axis limits, respectively.

How do you rescale Y axis in R?

To change the axis scales on a plot in base R Language, we can use the xlim() and ylim() functions. The xlim() and ylim() functions are convenience functions that set the limit of the x-axis and y-axis respectively.

What does GG in Ggplot represent?

The ggplot2 package is a relatively novel approach to generating highly informative publication-quality graphics. The “gg” stands for “Grammar of Graphics”.


1 Answers

I was not able to reproduce your behaviour. See this:

df <- data.frame(x=runif(100), y=(runif(100)-1/2)/1e8)
p <- ggplot(df, aes(x, y)) + geom_point()
p + scale_y_continuous(labels=f2si)

enter image description here

I have also found another similar function, if you don't like "0 n" label:

  format_si <- function(...) {
  # Based on code by Ben Tupper
  # https://stat.ethz.ch/pipermail/r-help/2012-January/299804.html

  function(x) {
    limits <- c(1e-24, 1e-21, 1e-18, 1e-15, 1e-12,
                1e-9,  1e-6,  1e-3,  1e0,   1e3,
                1e6,   1e9,   1e12,  1e15,  1e18,
                1e21,  1e24)
    prefix <- c("y",   "z",   "a",   "f",   "p",
                "n",   "µ",   "m",   " ",   "k",
                "M",   "G",   "T",   "P",   "E",
                "Z",   "Y")

    # Vector with array indices according to position in intervals
    i <- findInterval(abs(x), limits)

    # Set prefix to " " for very small values < 1e-24
    i <- ifelse(i==0, which(limits == 1e0), i)

    paste(format(round(x/limits[i], 1),
                 trim=TRUE, scientific=FALSE, ...),
          prefix[i])
  }
}

p + scale_y_continuous(labels=format_si())

enter image description here

like image 97
tonytonov Avatar answered Sep 18 '22 15:09

tonytonov