【问题标题】:setting chart.js stacked bar chart data dynamically动态设置chart.js堆积条形图数据
【发布时间】:2018-12-04 03:36:21
【问题描述】:

我的堆积条形图如下所示

  <canvas baseChart
                        [datasets]="barChartData"
                        [labels]="barChartLabels"
                        [options]="barChartOptions"
                        [legend]="barChartLegend"
                        [chartType]="barChartType"
                        (chartHover)="chartHovered($event)"
                        (chartClick)="chartClicked($event)"></canvas>
              </div>

我已经看到了替换特定数据数组的示例。这也适用于我。但是,就我而言,我想替换整个数据集。它在我的代码中的外观是:

  this.barChartData = [{"data":[3,0,0,0],"label":"dialog"},{"data":[16199,0,0,0],"label":"AtkBBBFuseFeedsFrontPage"},{"data":[52799,0,0,0],"label":"SandboxHover"},{"data":[11343,0,0,0],"label":"ManageSandboxes"}]
        this.chart.chart.data.datasets = this.barChartData
         this.chart.chart.data.labels = ["session1","session2","session3", "session4"]
          this.chart.chart.update()

但是,这不起作用。而且chart根本不渲染上面的数据。

另外,如果我像下面那样在初始化时放入相同的数据,那么它就可以正常工作。所以这不是数据的问题。

import { BaseChartDirective } from 'ng2-charts'
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
@ViewChild(BaseChartDirective)
  public chart: BaseChartDirective;
public barChartOptions:any = {
    scaleShowVerticalLines: false,
    responsive: true,
    scales: {
      xAxes: [{ stacked: true }],
      yAxes: [{ stacked: true }]
    }
  };
     public barChartLabels:string[] = ["session1", "session2", "session3", "session4"];
      public barChartType:string = 'bar';
      public barChartLegend:boolean = true;

      public barChartData:any[] = [{"data":[3,0,0,0],"label":"dialog"},{"data":[16199,0,0,0],"label":"AtkBBBFuseFeedsFrontPage"},{"data":[52799,0,0,0],"label":"SandboxHover"},{"data":[11343,0,0,0],"label":"ManageSandboxes"}]

旧数据:

public barChartData:any[] = [{data:[0,0,0,0],label:"dialog"},
                              {data:[0,0,0,0],label:"AtkBBBFuseFeedsFrontPage"},
                              {data:[0,0,0,0],label:"SandboxHover"},
                              {data:[0,0,0,0],label:"ManageSandboxes"}]

新数据

 this.barChartData =  [{"data":[3,0,0,0],"label":"dialog"},{"data":[16199,0,0,0],"label":"AtkBBBFuseFeedsFrontPage"},{"data":[52799,0,0,0],"label":"SandboxHover"},{"data":[11343,0,0,0],"label":"ManageSandboxes"}]

【问题讨论】:

  • 你能发布你的完整代码吗?
  • 添加了更多相关部分。没有别的了。
  • 控制台是否抛出任何错误..??其实你不需要做chart.chart.datasets = this.barChartData。假设您需要在单击按钮时刷新它。如果您分配 this.barChartData = [your new whole data objects here],则单击该按钮,但在示例中我看到您的数据是相同的,所以这可能是您没有看到任何变化的原因用户界面
  • 简单分配不起作用。我已经试过了

标签: javascript angular chart.js chart.js2


【解决方案1】:

我认为它可以正常工作,但您看不到更改,因为您之前的数据和更改后的数据完全相同。所以,它没有更新。我运行了你的代码,它正在运行。

html:我创建了一个额外的按钮来更改数据。

<canvas baseChart
                        [datasets]="barChartData"
                        [labels]="barChartLabels"
                        [options]="barChartOptions"
                        [legend]="barChartLegend"
                        [chartType]="barChartType"
                        (chartHover)="chartHovered($event)"
                        (chartClick)="chartClicked($event)">
    </canvas>

     <button (click)="changeData()">CLICK</button>

ts 文件:

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'myapp';

  public barChartOptions: any = {
    scaleShowVerticalLines: false,
    responsive: true,
    scales: {
      xAxes: [{ stacked: true }],
      yAxes: [{ stacked: true }]
    }
  };
  public barChartLabels: string[] = ["session1", "session2", "session3", "session4"];
  public barChartType: string = 'bar';
  public barChartLegend: boolean = true;

  public barChartData: any[] = [
    {data: [65, 59, 80, 81, 56, 55, 40], label: 'Series A'},
      {data: [28, 48, 40, 19, 86, 27, 90], label: 'Series B'},
      {data: [18, 48, 77, 9, 100, 27, 40], label: 'Series C'}];

  public changeData(): any{
    this.barChartData = [
      {data: [10, 2, 80, 81, 36, 55, 40], label: 'Series D'},
      {data: [28, 87, 40, 19, 67, 27, 9], label: 'Series E'},
      {data: [18, 48, 66, 9, 58, 27, 40], label: 'Series F'}
    ];
  }
}

我的代码运行良好。

【讨论】:

  • 如果你改变数据的形状会怎样。所以将它初始化为 public barChartDate:any[]=[{data:[65, 59, 80, 81, 56, 55, 40], label: 'Series A'}] 和点击按钮做你所做的。这对你有用吗?
  • 你可以改变形状。执行 this.barChartData = [something] 时,您正在分配新数据。因此它将刷新所有内容并使用新数据进行绘制。你能提供数据吗.. 以前的和更改的。我不确定什么不起作用。这里一切正常。
  • 你在这里使用了@viewchild 的另一件事。我认为不需要。
  • 添加了我正在使用的数据
  • 这是我的观察。您完全更改数据,但无法更改尺寸。因此,如果您使用行数来初始化 barChartData,那么您不能动态地将其更改为 5 行。如果你这样做,那么只会更新前 4 行数据。
猜你喜欢
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 2022-06-23
相关资源
最近更新 更多