Search code examples
flot

display total of bar on flot hover


I would like to display total of bar on flot hover when I have multiple series. Also How can I hide the color from that stacked bar line of 0 values.

var datasets = [{
  "label": "Amend Existing Report",
  "data": [{
    "0": 1446422400000,
    "1": 0
  }, {
    "0": 1447027200000,
    "1": 0
  }, {
    "0": 1447632000000,
    "1": 0
  }, {
    "0": 1448236800000,
    "1": 0
  }, {
    "0": 1448841600000,
    "1": 0
  }, {
    "0": 1449446400000,
    "1": 1
  }, {
    "0": 1450051200000,
    "1": 0
  }, {
    "0": 1450656000000,
    "1": 0
  }, {
    "0": 1451260800000,
    "1": 0
  }, {
    "0": 1451865600000,
    "1": 0
  }, {
    "0": 1452470400000,
    "1": 0
  }, {
    "0": 1453075200000,
    "1": 1
  }, {
    "0": 1453680000000,
    "1": 1
  }, {
    "0": 1454284800000,
    "1": 0
  }],
  "idx": 0
}, {
  "label": "Investigate Report Problem",
  "data": [{
    "0": 1446422400000,
    "1": 1
  }, {
    "0": 1447027200000,
    "1": 0
  }, {
    "0": 1447632000000,
    "1": 2
  }, {
    "0": 1448236800000,
    "1": 4
  }, {
    "0": 1448841600000,
    "1": 0
  }, {
    "0": 1449446400000,
    "1": 1
  }, {
    "0": 1450051200000,
    "1": 0
  }, {
    "0": 1450656000000,
    "1": 2
  }, {
    "0": 1451260800000,
    "1": 0
  }, {
    "0": 1451865600000,
    "1": 0
  }, {
    "0": 1452470400000,
    "1": 0
  }, {
    "0": 1453075200000,
    "1": 5
  }, {
    "0": 1453680000000,
    "1": 0
  }, {
    "0": 1454284800000,
    "1": 0
  }],
  "idx": 1
}, {
  "label": "New Request (One Off Report)",
  "data": [{
    "0": 1446422400000,
    "1": 0
  }, {
    "0": 1447027200000,
    "1": 0
  }, {
    "0": 1447632000000,
    "1": 1
  }, {
    "0": 1448236800000,
    "1": 0
  }, {
    "0": 1448841600000,
    "1": 0
  }, {
    "0": 1449446400000,
    "1": 0
  }, {
    "0": 1450051200000,
    "1": 0
  }, {
    "0": 1450656000000,
    "1": 0
  }, {
    "0": 1451260800000,
    "1": 0
  }, {
    "0": 1451865600000,
    "1": 0
  }, {
    "0": 1452470400000,
    "1": 0
  }, {
    "0": 1453075200000,
    "1": 0
  }, {
    "0": 1453680000000,
    "1": 1
  }, {
    "0": 1454284800000,
    "1": 0
  }],
  "idx": 2
}, {
  "label": "New Request (Regular Report)",
  "data": [{
    "0": 1446422400000,
    "1": 4
  }, {
    "0": 1447027200000,
    "1": 0
  }, {
    "0": 1447632000000,
    "1": 2
  }, {
    "0": 1448236800000,
    "1": 2
  }, {
    "0": 1448841600000,
    "1": 0
  }, {
    "0": 1449446400000,
    "1": 1
  }, {
    "0": 1450051200000,
    "1": 0
  }, {
    "0": 1450656000000,
    "1": 0
  }, {
    "0": 1451260800000,
    "1": 1
  }, {
    "0": 1451865600000,
    "1": 1
  }, {
    "0": 1452470400000,
    "1": 0
  }, {
    "0": 1453075200000,
    "1": 3
  }, {
    "0": 1453680000000,
    "1": 2
  }, {
    "0": 1454284800000,
    "1": 0
  }],
  "idx": 3
}, {
  "label": "Other",
  "data": [{
    "0": 1446422400000,
    "1": 0
  }, {
    "0": 1447027200000,
    "1": 0
  }, {
    "0": 1447632000000,
    "1": 2
  }, {
    "0": 1448236800000,
    "1": 4
  }, {
    "0": 1448841600000,
    "1": 2
  }, {
    "0": 1449446400000,
    "1": 0
  }, {
    "0": 1450051200000,
    "1": 2
  }, {
    "0": 1450656000000,
    "1": 0
  }, {
    "0": 1451260800000,
    "1": 0
  }, {
    "0": 1451865600000,
    "1": 0
  }, {
    "0": 1452470400000,
    "1": 3
  }, {
    "0": 1453075200000,
    "1": 0
  }, {
    "0": 1453680000000,
    "1": 3
  }, {
    "0": 1454284800000,
    "1": 0
  }],
  "idx": 4
}, {
  "label": "Special Events",
  "data": [{
    "0": 1446422400000,
    "1": 0
  }, {
    "0": 1447027200000,
    "1": 0
  }, {
    "0": 1447632000000,
    "1": 0
  }, {
    "0": 1448236800000,
    "1": 1
  }, {
    "0": 1448841600000,
    "1": 0
  }, {
    "0": 1449446400000,
    "1": 3
  }, {
    "0": 1450051200000,
    "1": 1
  }, {
    "0": 1450656000000,
    "1": 0
  }, {
    "0": 1451260800000,
    "1": 0
  }, {
    "0": 1451865600000,
    "1": 0
  }, {
    "0": 1452470400000,
    "1": 0
  }, {
    "0": 1453075200000,
    "1": 0
  }, {
    "0": 1453680000000,
    "1": 0
  }, {
    "0": 1454284800000,
    "1": 0
  }],
  "idx": 5
}];

var ticks = [];
for (var i = 0; i < datasets[0].data.length; i++) {
  ticks.push(datasets[0].data[i][0]);
}

var options = {
  "legend": {
    "position": "ne",
    "noColumns": 6
  },
  "yaxis": {
    "min": 0
  },
  "xaxis": {
    "mode": "time",
    "timeformat": "%d %b",
    //    "tickSize": [7, "day"],
    ticks: ticks,
    "min": 1446163200000,
    "max": 1454544000000 // 1454284800000
  },
  "grid": {
    "clickable": true,
    "hoverable": true
  },
  "series": {
    "stack": true,
    "bars": {
      "show": true,
      "barWidth": 181440000.00000003,
      align: 'center'
    }
  }
};

$.plot($('#CAGraph'), datasets, options);




$("#CAGraph").bind("plothover", function(event, pos, item) {

  if (item) {

    console.log(item);
    var percent = item.datapoint[1].toFixed(0) - item.datapoint[2].toFixed(0);
    var total = item.datapoint[1].toFixed(0);
    
   
    $("#tooltip").show();
    $("#tooltip").html(
        item.series.label + " " + (percent) + "<br>Total: " + total)
      .css({
        top: item.pageY - 25,
        left: item.pageX + 10
      }).fadeIn(200);

  } else {
    $("#tooltip").hide();
  }

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://rawgit.com/flot/flot/master/jquery.flot.js"></script>
<script src="https://rawgit.com/Codicode/flotanimator/master/jquery.flot.animator.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/flot/0.8.3/jquery.flot.time.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/flot/0.8.3/jquery.flot.stack.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/flot.tooltip/0.8.5/jquery.flot.tooltip.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.11.2/moment.min.js"></script>

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" integrity="sha256-7s5uDGW3AHqw6xtJmNNtr+OBRJUlgkNJEo78P4b0yRw= sha512-nNo+yCHEyn0smMxSswnf/OnX6/KwJuZTlNZBjauKhTK0c+zT+q5JOCx0UFhXQ6rJR9jg6Es8gPuD2uZcYDLqSw=="
crossorigin="anonymous">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha256-KXn5puMvxCw+dAYznun+drMdG1IFl3agK0p/pqT9KAo= sha512-2e8qq0ETcfWRI4HJBzQiA3UoyFk6tbNyG+qSaIBZLyW9Xf3sWZHN/lxe9fTh1U45DpPf07yj94KsUHHWe4Yk1A==" crossorigin="anonymous"></script>




<div id="CAGraph" style="width:910px;height:400px"></div>
<div id=tooltip></div>


Solution

  • To get the total value per bar, run a loop over all data values and put them in a hashmap which you then can use in the tooltip generation. something like this:

    var totals = {};
    for (var i = 0; i < datasets.length; i++) {
      var dataset = datasets[i];
      for (var j = 0; j < dataset.data.length; j++) {
        var timestamp = dataset.data[j][0];
        var value = dataset.data[j][1];
    
        if (totals['_' + timestamp]) {
          totals['_' + timestamp] += value;
        } else {
          totals['_' + timestamp] = value;
        }
      }
    }
    

    To remove the bars width height zero, set the lineWidth option for the bars to zero:

      "series": {
        "stack": true,
        "bars": {
          "show": true,
          "barWidth": 181440000.00000003,
          align: 'center',
          lineWidth: 0
        }
      }
    

    Both changes are included in the updated code snippet below:

    var datasets = [{
      "label": "Amend Existing Report",
      "data": [{
        "0": 1446422400000,
        "1": 0
      }, {
        "0": 1447027200000,
        "1": 0
      }, {
        "0": 1447632000000,
        "1": 0
      }, {
        "0": 1448236800000,
        "1": 0
      }, {
        "0": 1448841600000,
        "1": 0
      }, {
        "0": 1449446400000,
        "1": 1
      }, {
        "0": 1450051200000,
        "1": 0
      }, {
        "0": 1450656000000,
        "1": 0
      }, {
        "0": 1451260800000,
        "1": 0
      }, {
        "0": 1451865600000,
        "1": 0
      }, {
        "0": 1452470400000,
        "1": 0
      }, {
        "0": 1453075200000,
        "1": 1
      }, {
        "0": 1453680000000,
        "1": 1
      }, {
        "0": 1454284800000,
        "1": 0
      }],
      "idx": 0
    }, {
      "label": "Investigate Report Problem",
      "data": [{
        "0": 1446422400000,
        "1": 1
      }, {
        "0": 1447027200000,
        "1": 0
      }, {
        "0": 1447632000000,
        "1": 2
      }, {
        "0": 1448236800000,
        "1": 4
      }, {
        "0": 1448841600000,
        "1": 0
      }, {
        "0": 1449446400000,
        "1": 1
      }, {
        "0": 1450051200000,
        "1": 0
      }, {
        "0": 1450656000000,
        "1": 2
      }, {
        "0": 1451260800000,
        "1": 0
      }, {
        "0": 1451865600000,
        "1": 0
      }, {
        "0": 1452470400000,
        "1": 0
      }, {
        "0": 1453075200000,
        "1": 5
      }, {
        "0": 1453680000000,
        "1": 0
      }, {
        "0": 1454284800000,
        "1": 0
      }],
      "idx": 1
    }, {
      "label": "New Request (One Off Report)",
      "data": [{
        "0": 1446422400000,
        "1": 0
      }, {
        "0": 1447027200000,
        "1": 0
      }, {
        "0": 1447632000000,
        "1": 1
      }, {
        "0": 1448236800000,
        "1": 0
      }, {
        "0": 1448841600000,
        "1": 0
      }, {
        "0": 1449446400000,
        "1": 0
      }, {
        "0": 1450051200000,
        "1": 0
      }, {
        "0": 1450656000000,
        "1": 0
      }, {
        "0": 1451260800000,
        "1": 0
      }, {
        "0": 1451865600000,
        "1": 0
      }, {
        "0": 1452470400000,
        "1": 0
      }, {
        "0": 1453075200000,
        "1": 0
      }, {
        "0": 1453680000000,
        "1": 1
      }, {
        "0": 1454284800000,
        "1": 0
      }],
      "idx": 2
    }, {
      "label": "New Request (Regular Report)",
      "data": [{
        "0": 1446422400000,
        "1": 4
      }, {
        "0": 1447027200000,
        "1": 0
      }, {
        "0": 1447632000000,
        "1": 2
      }, {
        "0": 1448236800000,
        "1": 2
      }, {
        "0": 1448841600000,
        "1": 0
      }, {
        "0": 1449446400000,
        "1": 1
      }, {
        "0": 1450051200000,
        "1": 0
      }, {
        "0": 1450656000000,
        "1": 0
      }, {
        "0": 1451260800000,
        "1": 1
      }, {
        "0": 1451865600000,
        "1": 1
      }, {
        "0": 1452470400000,
        "1": 0
      }, {
        "0": 1453075200000,
        "1": 3
      }, {
        "0": 1453680000000,
        "1": 2
      }, {
        "0": 1454284800000,
        "1": 0
      }],
      "idx": 3
    }, {
      "label": "Other",
      "data": [{
        "0": 1446422400000,
        "1": 0
      }, {
        "0": 1447027200000,
        "1": 0
      }, {
        "0": 1447632000000,
        "1": 2
      }, {
        "0": 1448236800000,
        "1": 4
      }, {
        "0": 1448841600000,
        "1": 2
      }, {
        "0": 1449446400000,
        "1": 0
      }, {
        "0": 1450051200000,
        "1": 2
      }, {
        "0": 1450656000000,
        "1": 0
      }, {
        "0": 1451260800000,
        "1": 0
      }, {
        "0": 1451865600000,
        "1": 0
      }, {
        "0": 1452470400000,
        "1": 3
      }, {
        "0": 1453075200000,
        "1": 0
      }, {
        "0": 1453680000000,
        "1": 3
      }, {
        "0": 1454284800000,
        "1": 0
      }],
      "idx": 4
    }, {
      "label": "Special Events",
      "data": [{
        "0": 1446422400000,
        "1": 0
      }, {
        "0": 1447027200000,
        "1": 0
      }, {
        "0": 1447632000000,
        "1": 0
      }, {
        "0": 1448236800000,
        "1": 1
      }, {
        "0": 1448841600000,
        "1": 0
      }, {
        "0": 1449446400000,
        "1": 3
      }, {
        "0": 1450051200000,
        "1": 1
      }, {
        "0": 1450656000000,
        "1": 0
      }, {
        "0": 1451260800000,
        "1": 0
      }, {
        "0": 1451865600000,
        "1": 0
      }, {
        "0": 1452470400000,
        "1": 0
      }, {
        "0": 1453075200000,
        "1": 0
      }, {
        "0": 1453680000000,
        "1": 0
      }, {
        "0": 1454284800000,
        "1": 0
      }],
      "idx": 5
    }];
    
    var ticks = [];
    for (var i = 0; i < datasets[0].data.length; i++) {
      ticks.push(datasets[0].data[i][0]);
    }
    
    var totals = {};
    for (var i = 0; i < datasets.length; i++) {
      var dataset = datasets[i];
      for (var j = 0; j < dataset.data.length; j++) {
        var timestamp = dataset.data[j][0];
        var value = dataset.data[j][1];
    
        if (totals['_' + timestamp]) {
          totals['_' + timestamp] += value;
        } else {
          totals['_' + timestamp] = value;
        }
      }
    }
    
    var options = {
      "legend": {
        "position": "ne",
        "noColumns": 6
      },
      "yaxis": {
        "min": 0
      },
      "xaxis": {
        "mode": "time",
        "timeformat": "%d %b",
        //    "tickSize": [7, "day"],
        ticks: ticks,
        "min": 1446163200000,
        "max": 1454544000000 // 1454284800000
      },
      "grid": {
        "clickable": true,
        "hoverable": true
      },
      "series": {
        "stack": true,
        "bars": {
          "show": true,
          "barWidth": 181440000.00000003,
          align: 'center',
          lineWidth: 0
        }
      }
    };
    
    $.plot($('#CAGraph'), datasets, options);
    
    
    $("#CAGraph").bind("plothover", function(event, pos, item) {
    
      if (item) {
    
        var percent = item.datapoint[1].toFixed(0) - item.datapoint[2].toFixed(0);
        var total = totals['_' + item.datapoint[0]]; //item.datapoint[1].toFixed(0);
    
        $("#tooltip").show();
        $("#tooltip").html(
            item.series.label + " " + (percent) + "<br>Total: " + total)
          .css({
            top: item.pageY - 25,
            left: item.pageX + 10
          }).fadeIn(200);
    
      } else {
        $("#tooltip").hide();
      }
    
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script src="https://rawgit.com/flot/flot/master/jquery.flot.js"></script>
    <script src="https://rawgit.com/Codicode/flotanimator/master/jquery.flot.animator.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/flot/0.8.3/jquery.flot.time.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/flot/0.8.3/jquery.flot.stack.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/flot.tooltip/0.8.5/jquery.flot.tooltip.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.11.2/moment.min.js"></script>
    
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" integrity="sha256-7s5uDGW3AHqw6xtJmNNtr+OBRJUlgkNJEo78P4b0yRw= sha512-nNo+yCHEyn0smMxSswnf/OnX6/KwJuZTlNZBjauKhTK0c+zT+q5JOCx0UFhXQ6rJR9jg6Es8gPuD2uZcYDLqSw=="
    crossorigin="anonymous">
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha256-KXn5puMvxCw+dAYznun+drMdG1IFl3agK0p/pqT9KAo= sha512-2e8qq0ETcfWRI4HJBzQiA3UoyFk6tbNyG+qSaIBZLyW9Xf3sWZHN/lxe9fTh1U45DpPf07yj94KsUHHWe4Yk1A==" crossorigin="anonymous"></script>
    
    
    <div id="CAGraph" style="width:910px;height:400px"></div>
    <div id=tooltip></div>