【问题标题】:chart.js dynamically set values of suggestedMin and suggestedMax based on values of arraychart.js 根据数组的值动态设置建议的最小值和建议的最大值
【发布时间】:2020-08-08 18:43:53
【问题描述】:

问题

使几条曲线的图表更具可读性-尤其是这种浅绿色,在某些地方具有相同的值并且是直的

如何解决这个问题

设置 y 轴的最小值和最大值 iot 在曲线上方和下方留出更多空间。 此值可以通过以下代码设置:

public lineChartOptions:any = {            
    scales: {
        yAxes: [{
          id: 'SeriesA',
          position: 'left',
          ticks: {
            suggestedMin: 0,
            suggestedMax: 100
          }
        }]
    }
};

Chart.js 会自动计算这个最小值和最大值,但是在某些地方我想扩展它(通过设置建议最小值和建议最大值)。值应基于数组的最小值(缩小 10%)和数组的最大值(放大 10%)。

对于这样的示例数据,我希望 Y 轴的最小值为 54,最大值为 66

public seriesA: Array<number> = [59.023, 59.023, 59.034, 59.034, 59.034, 59.039, 59.05, 59.061, 59.088, 59.104];
    
public minMaxSeries: Array<number> = [0, 0];

 ngOnInit(): void {
    // calc min and max value of array
    this.minMaxSeries[0] = this.seriesB.reduce((prev, curr) => {
      return Math.min(prev, curr);
    });
    this.minMaxSeries[1] = this.seriesB.reduce((prev, curr) => {
      return Math.max(prev, curr);
    });
  
    // set values of min and max to the nearest integer value depends on its positive and negative values
    if (this.minMaxSeries[0] >= 0) {
      this.minMaxSeries[0] = Math.ceil(this.minMaxSeries[0] - 0.1 * this.minMaxSeries[0]);
    } else {
      this.minMaxSeries[0] = Math.floor(this.minMaxSeries[0] + 0.1 * this.minMaxSeries[0]);
    }
    if (this.minMaxSeries[1] >= 0) {
      this.minMaxSeries[1] = Math.ceil(this.minMaxSeries[1] + 0.1 * this.minMaxSeries[1]);
    } else {
      this.minMaxSeries[1] = Math.floor(this.minMaxSeries[1] - 0.1 * this.minMaxSeries[1]);
    }
    console.log(this.minMaxSeries)
  }

我的代码: Angular project

【问题讨论】:

    标签: angular typescript chart.js


    【解决方案1】:

    更改 minMaxSeries 上的值不会改变 lineChartOptions。如果在ngOnInit() 的末尾添加console.log(this.lineChartOptions);,您将看到suggestedMinsuggestedMax 的值仍然为零。

    要解决您的问题,您应该直接在lineChartOptions 上设置选项,如下所示:

    this.lineChartOptions.scales.yAxes[0].ticks.suggestedMin = min;
    this.lineChartOptions.scales.yAxes[0].ticks.suggestedMax = max;
    

    ngOnInit() 方法可以简化如下。

    ngOnInit(): void {
      this.lineChartOptions.scales.yAxes[0].ticks.suggestedMin = Math.floor(Math.min(...this.seriesB));
      this.lineChartOptions.scales.yAxes[0].ticks.suggestedMax = Math.ceil(Math.max(...this.seriesB));
    }  
    

    请查看您修改后的StackBlitz

    【讨论】:

    • 这在组件开始时初始化数据时有效。事实上,我从外部数据库获取数据,在ngOnInit 方法中,我设置了 this.seriesA、seriesB 等数组的值 - 在这样的配置中它不起作用
    • 当我在 console.log 上设置值 this.lineChartOptions.scales.yAxes[0].ticks.suggestedMin = Math.floor(Math.min(...this.seriesB)); 时,会有适当的值,但是它不会改变 y 轴上的值。
    • 你看过修改后的 StackBlitz 吗?或许更好的选择是使用 ticks.min 和 ticks.max。
    • 作为最后一次尝试,您可以摆脱ngOnInit 并将代码移动到constructor 中。这样可以确保在创建图表时 lineChartOptions 功能齐全。
    • 我认为我有这样一个问题,Array 的值也在 ngOnInit 方法中被初始化,如下所示:stackblitz.com/edit/… 但是在我的项目中曲线以正确的方式显示,
    猜你喜欢
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 2020-05-10
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多