2012-12-20 18 views
10

मैं अक्सर बाइट्स से संबंधित कुछ मापों के लिए जीएनयू आर/जीजीप्लॉट में आलेखों को प्लॉट करता हूं। बिल्टिन अक्ष लेबल या तो सादे संख्या या वैज्ञानिक नोटेशन हैं, यानी 1 मेगाबाइट = 1e6। मैं एसआई उपसर्ग (किलो = 1e3, मेगा = 1e6, गीगा = 1e9, आदि) की बजाय, यानी अक्ष को 1.5K, 5K, 1M, 150M, 4G आदि लेबल किया जाना चाहिएggplot2 अक्ष लेबल में एसआई उपसर्ग

मैं वर्तमान में निम्न कोड का उपयोग करता हूं:

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; 

मैं अगर इस समाधान सुधार किया जा सकता जानना चाहते हैं, के रूप में मेरे एक हर ग्राफ में बॉयलरप्लेट कोड का एक बहुत आवश्यकता है चाहते हैं।

+0

आप 'utils ::: print.object_size' – James

उत्तर

24

sitools पैकेज खोजने के लिए मैंने library("sos"); findFn("{SI prefix}") का उपयोग किया।

निर्माण डेटा:

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

लोड संकुल:

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

साजिश बनाएँ:

(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]")) 

मुझे यकीन है कि यह कैसे अपने कार्य करने के लिए तुलना नहीं कर रहा हूँ, लेकिन कम से कम कोई और इसे लिखने की परेशानी के लिए चला गया ...

मैं अपने कोड शैली में थोड़ा संशोधित - लाइनों के सिरों पर अर्धविराम हानिरहित हैं, लेकिन आम तौर पर एक MATLAB या सी सांकेतिक शब्दों में बदलनेवाला के हस्ताक्षर हैं ...

संपादित: मैं शुरू में एक सामान्य स्वरूपण समारोह परिभाषित

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

की (जैसे) scales::comma_format प्रारूप निम्नलिखित हैं, लेकिन वह इस मामले में अनावश्यक लगता है - गहरी ggplot2 जादू है कि मैं पूरी तरह से समझ में नहीं आता की सिर्फ एक हिस्सा है।

ओपी का कोड मुझे सही जवाब नहीं देता है: सही अक्ष अक्ष "टिक" के बजाय "1000K" है - इसे >1e6 परीक्षण >=1e6 पर बदलकर तय किया जा सकता है। दूसरी तरफ, f2si लोअर-केस k का उपयोग करता है - मुझे नहीं पता कि K चाहता है (toupper() में परिणामों को लपेटना इसे ठीक कर सकता है)।

ओपी परिणाम (si_vec):

enter image description here

मेरे परिणाम (f2si):

enter image description here

+1

+1 पर दिखाई दे सकता है 'एसओएस 'पैकेज, यह सिर्फ ** शानदार ** है !!! – Michele

संबंधित मुद्दे