【问题标题】:how to Create AngularJS charts with dynamic data如何使用动态数据创建 AngularJS 图表
【发布时间】:2016-11-30 01:35:21
【问题描述】:

您好,我正在尝试创建一个显示政客推文情绪的网页。我正在尝试为情绪统计创建图表。我正在使用 Zingchart,我可以为静态数据创建,但我无法为动态数据创建。

这是我用来插入带有数组chartdata的静态数据的代码。

   <div class="row">
    <div class="col-sm-12">
      <div ng-init="chartdata = [[1167],[456],[990]]">
        <zingchart id="chart-1" zc-values="chartdata" zc-json="myJson" 
         zc-width="100%" zc-height="568px"></zingchart>
      </div>
    </div>
  </div>

static pie chart

它像这样工作得很好,但我想使用来自我的 angularjs 的数据而不是静态值。 例如:我试图做这样的事情,但它不起作用

  <div class="row">
      <div class="col-sm-12">
        <div ng-init="chartdata =[[{{politicianData.stats.total_positive}}],[{{politicianData.stats.total_negative}}],[{{politicianData.stats.total_neutral}}]]">
          <zingchart id="chart-1" zc-values="chartdata" zc-json="myJson" zc-width="100%" zc-height="568px"></zingchart>
        </div>
      </div>
    </div>

如何从角度控制器的promise数组数据中获取数据?

这是我的政治控制者:

    angular.module('myapp')
    .controller('PoliticianController', function($scope, PoliticianData, Politician, searchService, utilService) {
var politicianData = new Politician(PoliticianData);

        politicianData.$promise.then(function (result) {

            $scope.politicianData = result;
  });
$scope.myJson = {
                            globals: {
                            shadow: false,
                            fontFamily: "Verdana",
                            fontWeight: "100"
                                        },
                                        type: "pie",
                                        backgroundColor: "#fff",

                                        legend: {
                                            layout: "x5",
                                            position: "50%",
                                            borderColor: "transparent",
                                            marker: {
                                                borderRadius: 10,
                                                borderColor: "transparent"
                                            }
                                        },
                                        tooltip: {
                                            text: "%v requests"
                                        },
                                        plot: {
                                            refAngle: "-90",
                                            borderWidth: "0px",
                                            valueBox: {
                                                placement: "in",
                                                text: "%npv %",
                                                fontSize: "15px",
                                                textAlpha: 1,
                                            }
                                        },
                                        series: [{
                                            text: "Positive",
                                            backgroundColor: "#FA6E6E",
                                        }, {
                                            text: "Negative",
                                            backgroundColor: "#D2D6DE"
                                        }, {
                                            text: "Neutral",
                                            backgroundColor: "#28C2D1"
                                        }]
                                    };

    });

这是政治家.html 页面

<span>{{politician.first_name}} {{politician.last_name}}</span>
                    </td>
                    <td>{{politicianData.stats.total}}</td>
                    <td>{{politicianData.stats.twitter.total}}</td>
                    <td>{{politicianData.stats.rss.total}}</td>
                   <td>{{politicianData.stats.total_negative}}</td>
                   <td>{{politicianData.stats.total_positive}}</td>
                   <td>{{politicianData.stats.total_neutral}}</td>

PoliticianData.stats.total_positive 正确显示计数,我想将相同的数据用作图表的输入值。 我该怎么做?

【问题讨论】:

    标签: html angularjs charts angular-controller zingchart


    【解决方案1】:
    • 使用工厂创建服务
    • 调用该服务获取数据
    • 仅使用 zingchart 指令
    • 当范围数据发生变化时,图表将打开。

    例子:

    var myModule = angular.module('myModule', []);
    
    myModule.controller('myController', function($scope, chartService) {
      $scope.chartdata = chartService.getDataWithService();
    });
    
    myModule.factory('chartService', function($http) {
      return {
        getDataWithService: function() {
          var url = "yourServiceURL";
          return $http.get(url);
        },
        getData: function() {
          return {
            type: 'line',
            series: [{
              values: [54, 23, 34, 23, 43]
            }, {
              values: [10, 15, 16, 20, 40]
            }]
          };
        }
      };
    });
    

    html:

     <zingchart id="chart-1" zc-values="chartdata" zc-json="myJson" zc-width="100%" zc-height="568px"></zingchart>
    

    【讨论】:

    • 您好,感谢您的回复……但我已经从开放数据库中获得了我的数据。看到上面的编辑..也许它会帮助你更好地理解我的问题。
    【解决方案2】:

    完全公开,我是 ZingChart 团队的成员。

    您正在寻找的这个确切的功能是数据绑定。我们在angularjs-charts 页面上有文档,用于将数据绑定到图表。

    在您的情况下,需要几个步骤来实现您想要的。我的第一个建议是在 ng-init 中将不必要的控制器逻辑从您的视图中移除,并将其保留在指令中。只是一个建议,没有必要。为了回答这个问题,我的格式会将大部分内容保留在控制器内。

    HTML:

    <body ng-app="myApp">
      <div ng-controller="MainController">
        <div zingchart id="chart-1" zc-json="myJson" zc-width="100%" zc-height="568px" zc-values="aValues"></div>
      </div>
    </body>
    

    应用逻辑:

    var app = angular.module('myApp',['zingchart-angularjs']);
    
    app.controller('MainController', function($scope, $timeout) {
    
    // mimick your promise
    (function(){
      $scope.data = {};
      $scope.data.valuesOne = [1,2,3,4,5];
      $scope.data.valuesTwo = [1,2,3,4,5];
      $scope.aValues = [$scope.data.valuesOne,$scope.data.valuesTwo];
    })();
    
    $scope.myJson = {
      type : "bar",
      title:{
        backgroundColor : "transparent",
        fontColor :"black",
        text : "Hello world"
      },
      backgroundColor : "white",
      series : [
        {
          backgroundColor : '#00baf2'
        },
        {
          backgroundColor : '#4caf4f'
        }
      ]
    };
    
     // automatically wraps code in $apply
     $timeout(function(){
    
       // wont reflect changes in aValues because its an object
       $scope.data.valuesOne = [5]; 
    
       // must force the reflection of the changes
       $scope.aValues = [$scope.data.valuesOne, $scope.data.valuesTwo];
    
       // will reflect changes with one line, not the above two lines
       //$scope.aValues[0] = [5];
    
     },1500);
    
    });
    

    您可以看到我设置了一个 $timeout 以反映 1.5 秒后的图形更改。这个 $timeout 是为了模仿数据库更新中的某种对象更改。有两种方法可以更新值,但要了解为什么我们必须首先了解有关 ZingChart Angular 指令的更多信息。

    您必须在 HTML 中使用 zc-values 而不仅仅是 zc-json,因为 code 通过使用 $watchCollection()zc-values 上具有深度相等监视。

    “$watchCollection() 函数是上述两个 $watch() 配置之间的一种中间地带。它比普通的 $watch() 函数更深入;但是,它并不像深度相等的 $watch() 函数。与 $watch() 函数一样,$watchCollection() 通过比较物理对象引用来工作;然而,与 $watch() 函数不同的是,$watchCollection() 深入一层并对集合中的顶级项目执行额外的、浅层的参考检查。” -referenced here.

    这就是为什么当我更改 aValues 数组中的引用时它只会在我的示例中起作用。

    您可以看到在 $timeout 内部有两种方法可以更新图表的值。因为您有一个数组数组,所以不会反映对内部数组的更改,因为它们是深层对象属性。您可以看到更新单个数组必须强制分配回父级以反映更改。直接对父级进行更改将更新引用并在一行中反映更改。

    Codepen 演示 here.

    更多 Angular/ZingChart 链接

    1. Angular Page
    2. ZingChart Codepen

    【讨论】:

    • 我遇到了这个链接,目前我正在处理同样的需求。请检查示例codepen.io/anon/pen/BWGEYG。我想用数据 $scope.data.valuesOne = [10,20,30,40,5] 显示第一个堆积条,第二个堆积条应该代表数据 $scope.data.valuesTwo = [12,12,30,10 ,5]。我浏览了许多链接以找到解决方案,但我认为它不是那么直截了当..请建议。
    • 不幸的是,您看到输入的方式就是我们处理堆叠条的方式。这很简单。第一个系列 (data.valuesOne) 是堆栈中的第一行。第二个系列 (data.valuesTwo) 是每个堆栈中的第二行。您只需要将数据转换为该格式即可。
    • 如果您还有其他问题,请提出新问题。 $scope.data.valuesOne = [10,12]; $scope.data.valuesTwo = [20,12]; $scope.data.valuesThree = [30, 30]; $scope.data.valuesFour = [40, 10]; $scope.data.valuesFive = [5, 5] $scope.aValues = [$scope.data.valuesOne,$scope.data.valuesTwo,$scope.data.valuesThree,$scope.data.valuesFour,$scope.data .valuesFive];
    • @nardecky 我们可以使用 zingchart 绘制每 1 秒变化一次的图表吗?怎么样?
    猜你喜欢
    • 2019-03-13
    • 2016-04-08
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    相关资源
    最近更新 更多