KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I often plot graphs in GNU R / ggplot for some measurements related to bytes. The builtin axis labels are either plain numbers or scientific notation, ie 1 Megabyte = 1e6. I would like SI prefixes (Kilo = 1e3, Mega=1e6, Giga=1e9, etc) instead, i.e. axis should be labelled 1.5K, 5K, 1M, 150M, 4G etc. I currently use the following code: si_num <- function (x) { if (!is.na(x)) { if (x > 1e6) { chrs <- strsplit(format(x, scientific=12), split="")[[1]]; rem <- chrs[seq(1,length(chrs)-6)]; rem <- append(rem, "M"); } else if (x > 1e3) { chrs <- strsplit(format(x, scientific=12), split="")[[1]]; rem <- chrs[seq(1,length(chrs)-3)]; rem <- append(rem, "K"); } else { return(x); } return(paste(rem, sep="", collapse="")); } else return(NA); } si_vec <- function(x) { sapply(x, FUN=si_num); } library("ggplot2"); bytes=2^seq(0,20) + rnorm(21, 4, 2); time=bytes/(1e4 + rnorm(21, 100, 3)) + 8; my_data = data.frame(time, bytes); p <- ggplot(data=my_data, aes(x=bytes, y=time)) + geom_point() + geom_line() + scale_x_log10("Message Size [Byte]", labels=si_vec) + scale_y_continuous("Round-Trip-Time [us]"); p; I would like to know if this solution can be improved, as my one requires a lot of boilerplate code in every graph.
Tags (comma-separated)
Save Edits
Cancel