0

Learning AngularJS and HighCharts. [Plunker Link][1]

I would like to understand how I can get the data from a JSON object and dynamically update the values on the x-axis and the bar chart value. The Y-axis values are constant. Right now I have hard coded the values, I want the x-axis and bar chart values from the backend.

Here is what I have tried -

(function() {
  'use strict';
  angular.module('myModule', [])
    // Directive for generic chart, pass in chart options
    .directive('hcChart', function() {
      return {
        restrict: 'E',
        template: '<div></div>',
        scope: {
          options: '='
        },
        link: function(scope, element) {
          Highcharts.chart(element[0], scope.options);
        }
      };
    })

  .controller('MainCtrl', function($scope, $http) {

    $scope.chartData = [];
    $scope.totalCostList = [];

    loadChartData();

    function loadChartData() {
      var httpRequest = $http({
        method: 'GET',
        url: './example.json'
      }).then(function(response) {
        console.log(response.data);
        $scope.chartData = response.data;
        console.log("length:" + $scope.chartData.activityResponse.length);
        for (var i = 0; i < $scope.chartData.activityResponse.length; i++) {
          $scope.totalCostList.push(parseInt($scope.chartData.activityResponse[i].totalCost));
        }
        console.log($scope.totalCostList);
      });
    }

    //var chartData = $scope.totalCostList;
    var yAxisLabels = [1, 5000, 10000, 15000, 20000];
    var chartData = [
      10000, 5000, 4000, 15000, 16000, 10000, 5000, 4000, 15000, 2000,
      10000, 5000, 4000, 15000, 16000, 10000, 5000, 4000, 15000, 2000,
      10000, 5000, 4000, 15000, 16000, 10000, 5000, 4000, 15000, 2000,
      10000, 5000, 4000, 15000, 16000, 10000, 5000, 4000, 15000, 2000,
      10000, 5000, 4000, 15000, 16000, 10000, 5000, 4000, 15000, 2000,
      10000, 5000
    ];
    var dateLine = Date.UTC(2015, 0, 1);
    Highcharts.getOptions().colors[0] = {
      linearGradient: {
        x1: 0,
        y1: 0,
        x2: 0,
        y2: 1
      },
      stops: [
        [0, '#6EB7D8'],
        [0.4, '#2989D8'],
        [0.7, '#207cca'],
        [1, '#1E5799']
      ]
    };

    Highcharts.setOptions({
      lang: {
        thousandsSep: ','
      }
    });
    //To give the chart a bounce effect
    Math.easeOutBounce = function(pos) {
      if ((pos) < (1 / 2.75)) {
        return (7.5625 * pos * pos);
      }
      if (pos < (2 / 2.75)) {
        return (7.5625 * (pos -= (1.5 / 2.75)) * pos + 0.75);
      }
      if (pos < (2.5 / 2.75)) {
        return (7.5625 * (pos -= (2.25 / 2.75)) * pos + 0.9375);
      }
      return (7.5625 * (pos -= (2.625 / 2.75)) * pos + 0.984375);
    };
    $scope.chartOptions = {
      chart: {
        type: 'column',
        margin: [70, 30, 30, 80]
      },
      exporting: {
        enabled: false
      },
      credits: {
        enabled: false
      },
      legend: {
        enabled: false
      },
      title: {
        text: 'Weekly Inventory at Cost',
        style: {
          color: '#333'
        },
        align: 'left',
        x: 10,
        y: 20

      },

      xAxis: {
        type: 'datetime',
        dateTimeLabelFormats: {
          month: '%b'
        },
        lineColor: '#333',
        tickColor: '#333',
        crosshair: true,
        startOnTick: false,
        endOnTick: false,
        minPadding: 0,
        maxPadding: 0,
        tickmarkPlacement: 'on',
        labels: {
          align: 'left',
          rotation: 0
        }
      },
      yAxis: {
        crosshair: true,
        lineColor: '#333',
        tickColor: '#333',
        tickPositioner: function() {
          return yAxisLabels;
        },
        labels: {
          format: '{value:,.0f}'
        },
        title: {
          enabled: false
        },
        lineWidth: 1,
        tickWidth: 1,
        id: 'cost',
        gridLineWidth: 0,
        min: 1
      },


      plotOptions: {
        column: {
          pointPadding: 0.1,
          borderWidth: 0,
          pointPlacement: 'between'
        }
      },
      shadow: true,

      series: [{
        data: chartData,
        pointStart: dateLine,
        pointInterval: 7 * 24 * 3600 * 1000 // 7days
      }]
    };
  });

})();
<!DOCTYPE html>
<html ng-app="myModule">

<head>
  <link rel="stylesheet" href="style.css">
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script>
  <script src="https://code.highcharts.com/highcharts.js"></script>
  <script src="script.js"></script>
</head>

<body ng-controller="MainCtrl">
  <hc-chart options="chartOptions" style="width: 96%; height: 300px;">Placeholder for generic chart</hc-chart>
</body>

</html>

My example JSON - {"message": "success", "status": "OK", "activityResponse": [{ "storeNo": "00208", "wk": "1", "year": "2016", "totalCost": "349622.9" },{ "storeNo": "00208", "wk": "2", "year": "2016", "totalCost": "2000" }, { "storeNo": "00208", "wk": "3", "year": "2016", "totalCost": "15000" }] }

2
  • How about using the highcharts-ng which allows to update data in the simple way? jsfiddle.net/pablojim/7cAq3 Commented Jun 21, 2016 at 12:51
  • @SebastianBochan , I don't want to get the data on click. It should dynamically get updated by the REST end point. For now, I'm just using a mock JSON file to achieve this functionality. Commented Jun 22, 2016 at 20:36

1 Answer 1

1

Here is an approach to adding to the x-axis categories and updating the category values. Grab a reference to the chart's series when the chart is created.

var series = this.series[0];

Then, when there is an update to the data, make the following call.

series.setData(seriesDataSource, true, true, false);

I have adapted your Plunker to show an example of the chart with series records being added and updated. https://embed.plnkr.co/SWGuRTyTM3AU6yhptYvM/

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you, @Stringfellow . But this is not what I'm trying to achieve. I have updated the code to reflect the changes I am looking for.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.