share/collection.js: Add legend label formatter.
[collection4.git] / share / collection.js
index 6aff20f..05ca9ba 100644 (file)
@@ -28,29 +28,41 @@ var c4 =
 
 function value_to_string (value) /* {{{ */
 {
-  var abs_value = Math.abs (value);
+  var abs_value;
+  var v2s = function (value)
+  {
+    var tmp = Math.round (100.0 * value) / 100.0;
+    return ("" + tmp);
+  }
+
+  if (value == null)
+    return ('NaN');
+  else if (value == 0)
+    return ('0');
+
+  abs_value = Math.abs (value);
 
   if ((abs_value < 10000) && (abs_value >= 0.1))
-    return ("" + value);
+    return (v2s (value));
   else if (abs_value > 1)
   {
     if (abs_value < 10000000)
-      return ("" + (value / 1000) + "k");
+      return (v2s (value / 1000) + "k");
     else if (abs_value < 10000000000)
-      return ("" + (value / 1000000) + "M");
+      return (v2s (value / 1000000) + "M");
     else if (abs_value < 10000000000000)
-      return ("" + (value / 1000000000) + "G");
+      return (v2s (value / 1000000000) + "G");
     else
-      return ("" + (value / 1000000000000) + "T");
+      return (v2s (value / 1000000000000) + "T");
   }
   else
   {
     if (abs_value >= 0.001)
-      return ("" + (value * 1000) + "m");
+      return (v2s (value * 1000) + "m");
     else if (abs_value >= 0.000001)
-      return ("" + (value * 1000000) + "u");
+      return (v2s (value * 1000000) + "u");
     else
-      return ("" + (value * 1000000000) + "n");
+      return (v2s (value * 1000000000) + "n");
   }
 } /* }}} function value_to_string */
 
@@ -287,6 +299,51 @@ function instance_draw (inst, def, data_list) /* {{{ */
     },
     endOnTick: false
   };
+  chart_opts.legend =
+  {
+    labelFormatter: function ()
+    {
+      var series = this;
+      var min = Number.MAX_VALUE;
+      var max = Number.NEGATIVE_INFINITY;
+      var num = 0;
+      var sum = 0;
+      var avg;
+      var i;
+
+      for (i = 0; i < this.data.length; i++)
+      {
+        var v;
+
+        v = this.data[i].y;
+        if (v == null)
+          continue;
+
+        if (min > v)
+          min = v;
+        if (max < v)
+          max = v;
+
+        sum += v;
+        num++;
+      }
+
+      if (num == 0)
+      {
+        min = null;
+        max = null;
+        avg = null;
+      }
+      else
+      {
+        avg = sum / num;
+      }
+
+      return (this.name + " (" + value_to_string (min) + " min, "
+          + value_to_string (avg) + " avg, "
+          + value_to_string (max) + " max)");
+    }
+  };
   chart_opts.series = new Array ();
 
   if (def.title)