2012-12-20 13 views
10

I diagrammi spesso in GNU R/ggplot per alcune misurazioni relative ai byte. Le etichette degli assi incorporate sono numeri semplici o notazioni scientifiche, ovvero 1 Megabyte = 1e6. Vorrei prefissi SI (Kilo = 1e3, Mega = 1e6, Giga = 1e9, ecc.), Cioè l'asse dovrebbe essere etichettato 1.5K, 5K, 1M, 150M, 4G ecc.Prefissi SI nelle etichette degli assi ggplot2

Attualmente uso il seguente codice:

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; 

Vorrei sapere se questa soluzione può essere migliorata, come il mio unico richiede un sacco di codice standard in ogni grafico.

+0

si poteva guardare 'utils ::: print.object_size' – James

risposta

24

Ho utilizzato library("sos"); findFn("{SI prefix}") per trovare il pacchetto sitools.

dati

Construct:

bytes <- 2^seq(0,20) + rnorm(21, 4, 2) 
time <- bytes/(1e4 + rnorm(21, 100, 3)) + 8 
my_data <- data.frame(time, bytes) 

pacchetti Load:

library("sitools") 
library("ggplot2")  

Creare la trama:

(p <- ggplot(data=my_data, aes(x=bytes, y=time)) + 
    geom_point() + 
    geom_line() + 
    scale_x_log10("Message Size [Byte]", labels=f2si) + 
    scale_y_continuous("Round-Trip-Time [us]")) 

io non sono sicuro di come questo confronto alla funzione, ma almeno qualcun altro si è preso il disturbo di scriverlo ...

ho modificato il tuo stile di codice un po '- il punto e virgola alla fine delle linee sono innocui, ma sono generalmente il segno di un MATLAB o C coder ...

Edit: inizialmente ho definito una funzione di formattazione generica

si_format <- function(...) { 
    function(x) f2si(x,...) 
} 

seguendo il formato di (ad esempio) scales::comma_format, ma che sembra inutile in questo caso - solo una parte del più profondo ggplot2 magia che io non capisco pienamente.

codice del PO dà quello che mi sembra di non essere abbastanza la risposta giusta: quella più a destra tick asse è "1000K" piuttosto che "1M" - questo può essere risolto modificando il test >1e6->=1e6. D'altra parte, f2si utilizza la minuscola k - Non so se è richiesto K (il completamento dei risultati in toupper() potrebbe risolvere il problema).

risultati OP (si_vec):

enter image description here

I miei risultati (f2si):

enter image description here

+1

+1 per Pacchetto 'SOS', è solo ** geniale ** !!! – Michele

Problemi correlati