【问题标题】:ng2-charts bar graph not displaying data/graph labelsng2-charts 条形图不显示数据/图形标签
【发布时间】:2017-09-26 06:48:34
【问题描述】:

我在 angular2 中使用 ng2-charts 构建了一个水平条形图,但我不确定为什么我没有看到图形数据,也没有在我的控制台中看到任何错误。

HTML:

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

组件:

  result: Iresult[] = [];

  barChartLabels: string[] =[];
  barChartType: string = 'horizontalBar';
  barChartLegend: boolean = true;
  barChartData: any[] = [];

  barChartOptions: any = {
    scaleShowVerticalLines: false,
    responsive: true
  };
  barChartLabels: string[] =[];
  barChartType: string = 'horizontalBar';
  barChartLegend: boolean = true;
  barChartData: any[] = [];

getData(){
    this.dataService.getData().subscribe(
      data => {
        this.result = data;
        this.barChartLabels = this.result.map(item => item.label);
        console.log(this.barChartLabels); // RESULT: ["test 1", "test 2"]
        this.barChartData = this.result.map(item => item.data);
        console.log(this.barChartData); // RESULT: [25, 55]
      },
        error => this.errorMessage = <any>error);
        console.log(this.barChartLabels); // RESULT: []
        console.log(this.barChartData); // RESULT: []
  }

JSON 文件:

[
  {
    "id": 5,
    "label": "test 1",
    "data": 25
  },
  {
    "id": 6,
    "label": "test 2",
    "data": 55
  }
]

服务文件:

getData(): Observable<IChartData[]>{
        return this._http.get('https://api.myjson.com/bins/ywavt')
            .map((res:Response) => <IChartData[]> res.json())
            .do(data => console.log('All: ' + JSON.stringify(data))) //DEBUG USE
            .catch(this.handleError);
    }

private handleError(error: Response) {
        console.error(error);
        return Observable.throw(error.json().error || 'Server error');
    }

//Console do result: All: [{"id":5,"label":"test 1","data":25},{"id":6,"label":"test 2","data":55}]

接口类

export interface IChartData {
    id: number;
    label: string;
    data: any;
}

更新

这是我目前所拥有的 Plunker:https://plnkr.co/edit/0GyFTkuqF7m8JhUKK6Kl?p=preview

标签未显示,但彩色水平条未正确定位。

【问题讨论】:

    标签: angular ng2-charts


    【解决方案1】:

    更新 2

    由于在 subscribe 中异步初始化图表数据时问题仍然存在,一个可行的解决方案是使用 loading flag 结合 *ngIf 等待来自服务的数据之前加载初始化图表。

    看起来像这样:

    模板:

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

    组件:

    loaded = false;
    
    getData(){
        this.dataService.getData().subscribe(data => {
          this.resultData = data;
          this.barChartLabels = this.resultData.map(item => item.label);
          this.barChartData = this.resultData.map(item => item.data);
          this.loaded = true;
        }
    }
    

    这是PLUNKER

    更新 1

    根据您的评论,这有助于显示数据,但标签仍未显示。从您提供的代码中,很难知道原因,但您的数据可能有问题。你能把barChartDatabarCharLabels记录下来让我看看吗?

    这是您的示例的有效 plunker,但包含硬编码数据:PLUNKER

    原创

    ng2-chart 在内部使用ngOnChanges 来捕捉其输入数据的变化。这意味着修改您输入的数组不会触发更改。由于您的 barChartLabelsbarChartData 数组已经初始化为空数组,这就是图表将使用的。

    要触发ngOnChanges,您需要做的是在收到新数据时更改barChartLabelsbarChartData 的实际实例。

    在你的 getData 方法中替换这个:

    this.result.forEach( item => {
       this.barChartLabels.push(item.label);
       this.barChartData.push(item.dataInfo);
    })
    

    这样的:

    this.barChartLabels = this.result.map(item => item.label);
    this.barChartDatat = this.result.map(item => item.dataInfo);
    

    【讨论】:

    • 感谢您的帮助 - 我继续应用您的建议,我可以看到我的数据图表范围已经改变(这意味着它实际上正在经历)但我的标签没有显示在图表上- 因此不会出现彩色条。
    • 我正在查看 plunker,我想这意味着我的问题在填充我的数组时的某个服务。我将尝试使用 console.log 语句进行调试,看看最后会发生什么。硬编码确实对我有用,我需要从 json 导入它们
    • 所以我认为这个问题与 ng2-charts 画布标签有关,因为我没有看到任何理由为什么这不应该特别适用于 barCharData 看起来很好 - 有一个很多可能会更改画布的一些选项,所以我会玩这个,但我会继续并将其标记为答案。感谢您的帮助!
    • 这是一个工作示例,通过实现“已加载”标志。那对你有用吗? plnkr.co/edit/xr6xs6PmaF9iQ6DsRnHT?p=preview@bluePearl
    • 我认为你应该用最新的工作 plunker 更新你的答案,以防有人遇到同样的问题并寻找答案。
    猜你喜欢
    • 2021-04-25
    • 1970-01-01
    • 2017-07-20
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    相关资源
    最近更新 更多