Search code examples
javascriptcanvasjsstackedbarseries

Stacked bar plot using javascript


Hi all I am trying to plot stacked bar using canvasJS for following nested list:

pepidstat=[[[2016, 61, 'Feb'], [2011, 367, 'Feb'], [2013, 83, 'Feb'], [2014, 89, 'Feb'], [2015, 106, 'Feb']], [[2016, 43, 'Jan'], [2011, 128, 'Jan'], [2013, 150, 'Jan'], [2014, 74, 'Jan'], [2015, 121, 'Jan']]]

And my workable javascript is:

<script type="text/javascript">
  window.onload = function () {
    var chartbar = new CanvasJS.Chart("chartContainerBar",
    {
      title:{
      text: "Yearly Growth of Total Peptides"
      },
      animationEnabled: true,
      axisX: {
    interval: 1,
    labelFontSize: 10,
    lineThickness: 0
      },

      data:pepiddata
    });

    chartbar.render();
    chartbar={};
  }
  var pepidstatlist = {{ pepidstat|safe }};
  var pepiddata = [];var pepiddataSeries = { type: "stackedBar",showInLegend: "true" };
  var pepidname= [];
  var pepiddataPoints = [];
  for (pi = 0; pi < pepidstatlist.length;pi++) {
    piname = pepidstatlist[pi][0][2];
    for (pj = 0; pj < pepidstatlist[pi].length;pj++) {
      pidx=pepidstatlist[pi][pj][0];
      pidy=pepidstatlist[pi][pj][1];
      pepiddataPoints.push({
    x:pidx,      
    y: pidy,
    label: pidx,
    name:piname,
    toolTipContent: "{name}-{label}:{y}",   
      });
    }
    pepiddataSeries.name = piname; // here I want pass each month name

  }
  pepiddataSeries.dataPoints = pepiddataPoints;
  pepiddata.push(pepiddataSeries); 
  </script>

This script is working perfectly except I can't assign each month name in data series. Can you please suggest where do I need to modify my script? Thanks


Solution

  • You are just creating a single dataSeries. Create two dataSeries and push it to data. And everything else just works fine.

     
    pepidstat=[[[2011, 61, 'Feb'], [2012, 367, 'Feb'], [2013, 83, 'Feb'], [2014, 89, 'Feb'], [2015, 106, 'Feb']], [[2011, 43, 'Jan'], [2012, 128, 'Jan'], [2013, 150, 'Jan'], [2014, 74, 'Jan'], [2015, 121, 'Jan']]]
    
    var pepidstatlist = pepidstat;
    var pepiddata = [];
    var pepidname= [];
    
    for (pi = 0; pi < pepidstatlist.length;pi++) {
    	piname = pepidstatlist[pi][0][2]; //month 
      var pepiddataPoints = [];
    	for (pj = 0; pj < pepidstatlist[pi].length;pj++) {  
    		pidx=pepidstatlist[pi][pj][0]; //Year
    		pidy=pepidstatlist[pi][pj][1]; //value
    		pepiddataPoints.push({
        	x:pidx,      
        	y: pidy,
        	label: pidx,
        	name:piname,
        	toolTipContent: "{name}-{label}:{y}",   
    		});
    	}
      var pepiddataSeries = { type: "stackedBar", showInLegend: "true" };
    	pepiddataSeries.name = piname; // here I want pass each month name
    	pepiddataSeries.dataPoints = pepiddataPoints;
    	pepiddata.push(pepiddataSeries);
    }
    
    var chartbar = new CanvasJS.Chart("chartContainer",
    {
    	title:{
    		text: "Yearly Growth of Total Peptides"
    	},
    	animationEnabled: true,
    	axisX: {
    		interval: 1,
    		labelFontSize: 10,
    		lineThickness: 0
    	},
    	data: pepiddata,
    });
    
    chartbar.render();
    <script src="http://canvasjs.com/assets/script/canvasjs.min.js"></script>
    <br/><!-- Just so that JSFiddle's Result label doesn't overlap the Chart -->
    <div id="chartContainer" style="height: 360px; width: 100%;"></div>

    Tips: Sort your array based on year value inside your array.