Question

I am trying to make horizontal grouped stacked bar graph in NVD3.js. Everything works great until I got a "gap" in my JSON data like bellow:

 [{
       "key": "Education & news",
           "values": [{
           "label": "2014-02-26",
               "value": 702
       }, {
           "label": "2014-02-27",
               "value": 204
       }, {
           "label": "2014-02-28",
               "value": 3213
       }]
   }, {
       "key": "Entertainment",
           "values": [{
           "label": "2014-02-26",
               "value": 21
       },
//Missing entry for 2014-02-27
       {
           "label": "2014-02-28",
               "value": 3213
       }]
   }]

The error which I got is Uncaught TypeError: Cannot read property '1' of undefined in d3.js. The example and the error of the problem I put on http://jsfiddle.net/vaa3V/

Can I somehow fill gaps automatically?

Was it helpful?

Solution

@shabeer90's comment is on track. You can use underscore.js to get the domain values and apply a sensible default.

//Find domain values
DEFAULT = 0
defaults = _.chain(data)
  .pluck('values')
  .flatten().pluck('label')
  .uniq()
  .value()
  .map( function(item){ return {label:item, value:DEFAULT} })

// Group by 'label' so we can apply defaults
defaults = _.groupBy(defaults, 'label'))

// Apply defaults 
_.each(data, function (series) {  
    grouped = _.groupBy(series.values, 'label')
    series.values =  _.flatten( _.defaults(grouped, defaults)) 
})

Should give you:

[
   {
      "key": "Education & news",
      "values": [
         {
            "label": "2014-02-26",
            "value": 702
         },
         {
            "label": "2014-02-27",
            "value": 204
         },
         {
            "label": "2014-02-28",
            "value": 3213
         }
      ]
   },
   {
      "key": "Entertainment",
      "values": [
         {
            "label": "2014-02-26",
            "value": 21
         },
         {
            "label": "2014-02-28",
            "value": 3213
         },
         {
            "label": "2014-02-27",
            "value": 0
         }
      ]
   }
]
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top