简体   繁体   中英

Google charts timeline with relative "timestamps"

I'm trying to visualise speedrun times in a linechart, per date. I have the following data:

ID Date Time
1 2021-10-20 00:00:00 1:59:11.19
2 2021-10-21 00:00:00 1:55:33.43
3 2021-10-22 00:00:00 1:54:52.82
4 2021-10-23 00:00:00 1:53:44.15

The data will be converted to an array, as such;

var runs = [
    [1, "2021-10-20 00:00:00", "1:59:11.19"],
    [2, "2021-10-21 00:00:00", "1:55:33.43"],
    [3, "2021-10-22 00:00:00", "1:54:52.82"],
    [4, "2021-10-23 00:00:00", "1:53:44.15"]
];

I tried following the example from the dev docs , and the example JSFiddle without any luck. As they only show examples that support numbers or absolute datetimes / created times.

Is there a way to make a linechart work with relative times (including ms), showing all times chronologically per date?

if you are wanting to display the date on the x-axis and the time on the y-axis,
you can use google's timeofday data type for the y-axis

The DataTable timeofday column data type takes an array of either 3 or 4 numbers, representing hours, minutes, seconds, and optionally milliseconds, respectively.
For example, the time 8:30am would be: [8, 30, 0, 0]

following is routine used to build data.table

var data = new google.visualization.DataTable();
data.addColumn('date', 'Date');
data.addColumn('timeofday', 'Time');

for (var i = 0; i < runs.length; i++) {
  // convert date
  var rowDate = new Date(runs[i][1]);
  
  // convert time to timeofday data type [h, m, sec, ms]
  var rowTime = runs[i][2].split(':');
  var ms = rowTime[rowTime.length - 1].split('.');
  rowTime = rowTime.map(function (timeValue, index) {
    if (index === (rowTime.length - 1)) {
      return parseInt(ms[0]);
    } else {
      return parseInt(timeValue);
    }
  });
  rowTime.push(parseInt(ms[1]));
  
  // add data row
  data.addRow([rowDate, rowTime]);
}

see following working snippet...

 google.charts.load('current', { packages: ['corechart'] }).then(function () { var runs = [ [1, "2021-10-20 00:00:00", "1:59:11.19"], [2, "2021-10-21 00:00:00", "1:55:33.43"], [3, "2021-10-22 00:00:00", "1:54:52.82"], [4, "2021-10-23 00:00:00", "1:53:44.15"] ]; var data = new google.visualization.DataTable(); data.addColumn('date', 'Date'); data.addColumn('timeofday', 'Time'); for (var i = 0; i < runs.length; i++) { // convert date var rowDate = new Date(runs[i][1]); // convert time to timeofday data type [h, m, sec, ms] var rowTime = runs[i][2].split(':'); var ms = rowTime[rowTime.length - 1].split('.'); rowTime = rowTime.map(function (timeValue, index) { if (index === (rowTime.length - 1)) { return parseInt(ms[0]); } else { return parseInt(timeValue); } }); rowTime.push(parseInt(ms[1])); // add data row data.addRow([rowDate, rowTime]); } var chart = new google.visualization.LineChart(document.getElementById('chart')); chart.draw(data, { chartArea: { height: '100%', width: '100%', top: 40, left: 64, right: 40, bottom: 40 }, hAxis: { format: 'MM/dd/yyyy', ticks: data.getDistinctValues(0) }, height: '100%', legend: { position: 'top' }, width: '100%' }); });
 html, body { height: 100%; margin: 0px 0px 0px 0px; padding: 0px 0px 0px 0px; } #chart { min-height: 400px; height: 100%; }
 <script src="https://www.gstatic.com/charts/loader.js"></script> <div id="chart"></div>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM