Home > Mobile >  How to add zero-values when there is no data available? (Canvas.js)
How to add zero-values when there is no data available? (Canvas.js)

Time:12-11

I have a Canvas.js Stock Chart(line-chart) in which I display interactions(y-axis) per time(x-axis).

I get an Array<Date>and group the dates per hour. Depending on how many dates in the array have the same hour, I can say how many interactions there were, which I show with a dot in the chart.

If in one particular hour there were no Interactions at all it doesn't set a dot at zero. It connects the line directly to the next value and of course this displays the data incorrectly.

So my question is if there is a native way to set the hours - which don't have any interactions - to zero. If not, how do I fill the gaps manually with zeros?

Here is how my Chart looks like right now: Stock Chart

Here is the fiddle: https://jsfiddle.net/gx9hqs6o/39/

CodePudding user response:

So my question is if there is a native way to set the hours - which don't have any interactions - to zero.

In CanvasJS, the dataPoints passed are rendered as such without any manipulation done to the dataPoints.

If not, how do I fill the gaps manually with zeros?

You will have to loop through the dataPoints array and for all the missing data (gaps) you can add the missing dataPoint with the y-value as 0.

Below is a code-snippet,

function addMissingDps(stockChart) {    
      for(var i = 0; i <stockChart.options.charts[0].data.length; i  ) {
        var newDps = [];    
        var dps = stockChart.options.charts[0].data[i].dataPoints;

        /* Find Missing hours in a the dps array */
        var missingDates = dps.sort(function(a,b){
          return Date.parse(a.x) - Date.parse(b.x);
        }).reduce(function(hash){
          return function(p,c){
            var missingHoursNo = (Date.parse(c.x) - hash.prev) / (1000 * 60 * 60);
            if(hash.prev && missingHoursNo > 1) {
              for(var i = 1; i < missingHoursNo; i  )
                p.push(new Date(hash.prev   i * (1000 * 60 * 60)));
            }
            hash.prev = Date.parse(c.x);
            return p;
          };
        }(Object.create(null)),[]);

        /* Add missing dataPoints to the dataPoints array */    
        for(var j = 0; j < missingDates.length; j  ) {
          dps.push({x: missingDates[j], y: 0})      
        }    

        /* Sort newly added dates */
        dps.sort(function(a,b){      
          return Date.parse(a.x) - Date.parse(b.x);
        });
      }  
    }

You can take a look at this JSFiddle for a working example.

  • Related