繁体   English   中英

echarts:如何在条形图上添加正态分布曲线?

[英]echarts: How can I add a normal distribution curve on bar chart?

我使用 echarts 绘制了条形图:

在此处输入图像描述

如何在下图所示的条形图线上显示正态分布曲线:

在此处输入图像描述

export class MainComponent implements OnInit, AfterViewInit, OnDestroy {

  binsCount: number = 20;
  histogramDetails: any = [];

  //#endregion
  constructor(private router: Router,
    private store: Store<any>,
    private projectService: ProjectService,
    private taskService: TaskService,
    private messageService: MessageService, ) { }


  async createNewPlot(task: Task) {
    if(this.selectedPlotType.name === 'Histogram') {
       plotOption =  await this.loadHistogramPlotData(task) ;

    }
  }

  loadHistogramPlotData(task) {
    if (!task || !this.selectedVariableX) {
      return
    }
    return new Promise((resolve, reject) => {
      this.taskService.getOutputVariablesHistogramPlot(task.id, this.selectedVariableX.id).subscribe(
        response => {
          //reset data
          log.debug(`response = ${JSON.stringify(response)}`);
          const plotData = this.setHistogramDetails(response.hist_plot_data);
          resolve(plotData);
        },
        error => {
          log.error(error);
          reject(error)
        }
      );
    })
  }

  setHistogramDetails(histogramDetails: any) {
    // histogramDetails ? this.histogramDetails.push(histogramDetails) : null ;
    const nums = histogramDetails.realization
    let min = Math.floor(Math.min(...nums));
    let max = Math.ceil(Math.max(...nums));
    const binSize = (max - min) / this.binsCount;
    let xaxisData: number[] = [];
    let yseries = [];
    let previousNumber = min;
    for (let i = 0; i <= this.binsCount; i++) {
      xaxisData.push(parseFloat(previousNumber.toFixed(1)));
      yseries.push(0);
      previousNumber = previousNumber + binSize;
    }

    for (const num of nums) {
      for (let i = 1; i < xaxisData.length; i++) {
        if (num < xaxisData[i]) {
          yseries[i]++;
          break;
        }
      }
    }

    const plotData: number[] = yseries;
    const options = {
      grid: {
        left: 30,
        top: 10,
        bottom: 100
      },
      tooltip: {
        trigger: 'axis',
        axisPointer: {
          type: 'cross',
          crossStyle: {
            color: '#eee'
          }
        }
      },
      legend: {
        orient: 'vertical',
        left: '5%',
        bottom: 30,
        itemHeight: 3,
        itemGap: 14,
        textStyle: {
          fontSize: 10,
          color: '#333333'
        },
        data: ['Specified Distribution', 'Simulated Distribution']
      },
      xAxis: [
        {
          type: 'category',
          data: [xaxisData[0] * 10, ...xaxisData, xaxisData[xaxisData.length - 1] * 10],
          boundaryGap: ['40%', '40%'],
          axisTick: {
            alignWithLabel: true
          },
          axisPointer: {
            type: 'shadow'
          }
        }
      ],
      yAxis: [
        {
          type: 'value',
          splitNumber: 5,
          axisLabel: {
            formatter: '{value}',
            fontSize: 10
          }
        }
      ],
      dataZoom: [{
        type: 'inside',
        throttle: 50
      }],
      series: [
        {
          name: 'Simulated Distribution',
          type: 'bar',
          color: '#2DA8D8',
          large: true,
          data: plotData,
        }
      ],
      histogramDetails: histogramDetails
    };
    return options;
  };

}

Echarts 没有内置 function 正态分布。 您需要根据您的数据计算它,并像通常的line系列MarkLine一样添加条形图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM