only show 1 of every 7 data points so tables aren't pages long
[p2pool.git] / web-static / graphs.html
index 57aa2ab..dc08915 100644 (file)
@@ -3,6 +3,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
     <head>
         <title>P2Pool Graphs</title>
+        <link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
         <script type="text/javascript" src="d3.v2.min.js"></script>
         
         <style type="text/css">
@@ -50,6 +51,9 @@
         <h2>Desired versions</h2>
         <svg id="desired_versions"></svg>
         
+        <h2>Traffic rate</h2>
+        <svg id="traffic_rate"></svg>
+        
         <script type="text/javascript">
             function compose() {
                 var funcs = arguments;
             function plot(g, unit, total_unit, lines, stack) {
                 // lines is a list of objects which have attributes data, color, and label
                 
+                var table_div = document.createElement("div");
+                g.node().parentNode.insertBefore(table_div, g.node().nextSibling);
+                table_div.style.display = "none";
+                
+                var showhide = document.createElement("p");
+                g.node().parentNode.insertBefore(showhide, g.node().nextSibling);
+                d3.select(showhide).append("a")
+                    .text('Show/hide table')
+                    .on('click', function() { table_div.style.display = table_div.style.display == "block" ? "none" : "block" })
+                    .attr("style", "color:blue;text-decoration:underline;cursor:pointer");
+                
+                for(var i = 0; i < lines.length; ++i) {
+                    var line = lines[i];
+                    var table_sel = d3.select(table_div).append('table').attr('border', 1).attr('style', 'float:left');
+                    
+                    var first_tr = table_sel.insert('tr');
+                    first_tr.append('th').text('Date');
+                    first_tr.append('th').text(line.label + '/(' + unit + ')');
+                    
+                    var new_data = []
+                    for(var j = 0; j < line.data.length; ++j)
+                        if(j % 7 == 3)
+                            new_data.push(line.data[j]);
+                    var tr = table_sel.selectAll().data(new_data).enter().append('tr');
+                    tr.append('td').text(function(datum){return new Date(1000*datum[0]).toString()});
+                    tr.append('td').text(function(datum){return d3.format(".3s")(datum[1])});
+                }
+                d3.select(table_div).append('div').attr('style', 'clear:both');
+                
+                d3.select(table_div).append('p').append("a")
+                    .text('Show/hide table')
+                    .on('click', function() { table_div.style.display = table_div.style.display == "block" ? "none" : "block" })
+                    .attr("style", "color:blue;text-decoration:underline;cursor:pointer");
+                
+                
                 var w = 700;
                 var h = 300;
                 var margin_v = 40;
                     
                     var text_boxes = [];
                     var total = 0;
+                    var total_area = 0;
                     for(var i = 0; i < lines.length; ++i) {
                         var line = lines[i];
                         var stats = get_area_mean(line.data);
                                 .attr("fill", line.color)
                                 .attr("x", w - margin_h + 10)
                                 .attr("y", y(num/denom))]);
+                            if(total_unit != null)
+                                text_boxes.push([i, g.append("svg:text")
+                                    .text("Area: " + d3.format(".3s")(stats.area) + total_unit)
+                                    .attr("text-anchor", "start")
+                                    .attr("dominant-baseline", "central")
+                                    .attr("fill", line.color)
+                                    .attr("x", w - margin_h + 10)
+                                    .attr("y", y(num/denom) + 12)]);
                             total += stats.mean;
+                            total_area += stats.area;
                         }
                     }
                     text_boxes.push([i, g.append("svg:text")
                         .attr("text-anchor", "start")
                         .attr("dominant-baseline", "central")
                         .attr("fill", "black")
-                        .attr("x", w - margin_h + 2)
+                        .attr("x", w - margin_h)
                         .attr("y", y(total))]);
+                    if(total_unit != null)
+                        text_boxes.push([i, g.append("svg:text")
+                            .text("Area: " + d3.format(".3s")(total_area) + total_unit)
+                            .attr("text-anchor", "start")
+                            .attr("dominant-baseline", "central")
+                            .attr("fill", "black")
+                            .attr("x", w - margin_h + 10)
+                            .attr("y", y(total) + 12)]);
                 } else {
                     var y = d3.scale.linear().domain([
                         0,
                 d3.json("/web/graph_data/desired_versions/last_" + lowerperiod, function(data) {
                     plot(d3.select('#desired_versions'), '', null, data_to_lines(data, function(line){ return parseInt(line.label) }), true);
                 });
+                
+                d3.json("/web/graph_data/traffic_rate/last_" + lowerperiod, function(data) {
+                    plot(d3.select('#traffic_rate'), 'B/s', 'B', data_to_lines(data, function(line){ return parseInt(line.label) }), true);
+                });
             }
             
+            periods = ["Hour", "Day", "Week", "Month", "Year"];
+            d3.select("#period_chooser").selectAll().data(periods).enter().append("a")
+                .text(function(period) { return period })
+                .attr('href', function(period){ return "?" + period })
+                .attr("style", function(d, i) { return (i == 0 ? "" : "margin-left:.4em;") + "color:blue;text-decoration:underline;cursor:pointer" });
+            period = window.location.search.substr(1);
+            if(period == "") {
+                window.location.search = "Day";
+            }
             d3.json('/web/currency_info', function(currency_info) {
-                periods = ["Hour", "Day", "Week", "Month", "Year"];
-                d3.select("#period_chooser").selectAll().data(periods).enter().append("span")
-                    .text(function(period) { return period })
-                    .on("click", function(period){ change_period(period, currency_info) })
-                    .attr("style", function(d, i) { return (i == 0 ? "" : "margin-left:.4em;") + "color:blue;text-decoration:underline;cursor:pointer" });
-                change_period(periods[1], currency_info);
+                change_period(period, currency_info);
             });
         </script>
     </body>