【问题标题】:High Charts fails to add series dynamicallyHighcharts 无法动态添加系列
【发布时间】:2019-03-11 03:57:19
【问题描述】:

我是第一次使用 HighCharts,事实证明很难找到资源来帮助我解决这个问题。

我正在尝试显示具有不同系列数量的多个图表。我不想设置多个选项模板,我只想使用一个并使用一个函数来每次自定义选项对象。在这里,我提供了从 API 接收到的图表之一的模拟数据。在应用程序中,我计划从 HTML 提供它。

由于我对 HighCharts 缺乏了解,我一直遇到各种问题,现在我只是绕着圈子解决一个问题,只是为了再次弹出过去的问题我希望有人能指出我的正确之处方向。 这是我的班级:

export class CompletenessTabComponent implements OnInit, AfterViewInit {
  @ViewChild('chartTarget') chartTarget: ElementRef;

  chart: Highcharts.ChartObject;

  dataObj = {"id":0,
    "tableName":"d1 vs d2",
    "data":{"d1Count":[50,45,55,60,70],
      "d2Count":[40,32,55,58,33],
      "Errors":[2,3,4,1,0]},
    "dates":[20180927,20180928,20181001,20181002,20181003]
  };

  constructor() { }

  setHighChartOptions(data, seriesNames, chartTitle ): any {
    count = 1;
    highChartOptions.title.text = chartTitle;
    highChartOptions.xAxis.data = data.dates;
    this.chart.series[0].setData(this.dataObj.data[0]);
    Object.keys(data.data).forEach((key) =>
      this.chart.addSeries({
        name: seriesNames[count],
        data: data.data[key],
        type: 'line'
      }) count ++
    );
    return highChartOptions;
  }
  getHighChartOptions(){
    return highChartOptions;
  }
  ngOnInit() {
    this.chart = chart(this.chartTarget.nativeElement, this.setHighChartOptions(this.dataObj, ['d1', 'd2', 'error'], this.dataObj.tableName));
    Object.keys(this.dataObj.data).forEach(key =>
    console.log(key, this.dataObj.data[key]))
  }
  ngAfterViewInit() {
  }

}

const highChartOptions = {
  colors:
    ['#058DC7', '#50B432', '#ED561B', '#DDDF00', '#24CBE5', '#64E572', '#FF9655', '#FFF263', '#6AF9C4'],

  credits: {
    enabled: false
  },
  chart: {
    backgroundColor: null,
  },
  legend: {
    layout: 'vertical',
    align: 'right',
    verticalAlign: 'top',
    itemStyle: {
      fontSize: '10px',
      fontWeight: 'normal'
    }
  },
  tooltip: {
    valuePrefix: '$'
  },
  title: {
    text: ''
  },
  xAxis: {
    type: 'date',
    data: [],
    title: 'date'
  },
  yAxis: {
    title: {
      align: 'middle',
      rotation: 0,
      text: ''
    }
  },
  plotOptions: {
    series: {
      marker: {
        enabled: false
      },
      shadow: false
    }
  },
  series: [{
    type: 'line',
    name: '',
    data: [null]
  }]
};

我不断收到的一些错误是:

在 setHighChartOptions() 中:无法读取未定义的属性“系列”(在 this.chart.series[0]),& 无法读取未定义的“键”(在 ForEach 循环开始时)。

我认为最大的问题是图表对象未定义,这没有意义,因为我已经在类的顶部实例化了它,然后我在 onInit 上设置了图表选项。

我希望你能发现我的错误并帮助我。谢谢。

【问题讨论】:

  • 你的highChartOptionsconst 你不能修改const 只是去掉这个前缀

标签: javascript angular typescript highcharts


【解决方案1】:

首先,你必须小心在你的Angular项目中正确使用import all js package:

import { chart } from 'highcharts';
import * as Highcharts from 'highcharts';

另外,您必须检查您的软件包是否使用“npm”正确安装?

毕竟,在我看来,这个例子可以帮助你更好地理解如何在你的项目中使用“highcharts”包,其他配置取决于你使用的“highcharts”版本。

import { Component, ElementRef, ViewChild } from '@angular/core';
import { chart } from 'highcharts';
import * as Highcharts from 'highcharts';

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

  @ViewChild('chartTarget') chartTarget: ElementRef;

  chart: Highcharts.ChartObject;

  ngAfterViewInit() {
    const options: Highcharts.Options = {
      chart: {
        type: 'bar'
      },
      title: {
        text: 'Sample Title'
      },
      xAxis: {
        categories: ['Top Test', 'Test 2', 'Test3']
      },
      yAxis: {
        title: {
          text: 'Fox Rex'
        }
      },
      series: [{
        name: 'Tomi',
        data: [1, 0, 4]
      }, {
        name: 'Alex',
        data: [5, 7, 3]
      }]
    };

    this.chart = chart(this.chartTarget.nativeElement, options);
  }

  addSeries(){
    this.chart.addSeries({
      name:'Test',
      data:[2,3,7]
    })    
  }
}

样本的HTML模板:

<div #chartTarget>
  chart target sample
</div>

此外,您必须向 highcharts 提供数据,因为该格式是标准格式,请查看 highcharts 网站示例中的 JSON 示例数据格式。

【讨论】:

  • 谢谢,我会试试看这是否会有所作为
  • 您好,当我想在同一页面上显示多个图表时,这不起作用。我需要为每个图表定义一个新的图表对象吗?
  • 我决定创建一个单独的组件,我将向其提供数据,并且我可以在那里定义一个可用于创建多个图表的选项结构,希望可以工作
  • 一个好方法是为它们中的任何一个制作一个新组件,尽管您可以显示多个组件。如果图表类型对您不重要,请查看 D3 和 C3 图表而不是 Highchart。此外,对于图表对象,您可以拥有一个对象并为您的任何图表覆盖该对象。
  • 我在看这个,但是在为模拟数据等结构设置图表对象之前,如何使用 addSeries() 函数添加到选项。那就是我在实例化图表时遇到问题的地方=/
【解决方案2】:

很可能是因为您试图引用尚未定义的系列。实际上,如果您是第一次调用setHighchartsOptions,您的图表还没有定义。

为了让它工作,请先尝试初始化图表(甚至可以是空图表,没有任何数据),然后在Chart对象上调用另一个方法,如addSeries。类似的东西,但我没有看到你的整个应用程序,所以很难编写完全调整的解决方案。

ngOnInit() {
    this.chart = chart(this.chartTarget.nativeElement, {});
    this.chart.update(this.setHighChartOptions(this.dataObj, ['d1', 'd2', 'error'], this.dataObj.tableName))
    Object.keys(this.dataObj.data).forEach(key =>
    console.log(key, this.dataObj.data[key]))
  }

【讨论】:

  • 是的,我也想通了。我意识到设置选项功能导致了问题。
猜你喜欢
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多