init()

in src/Wlinebox/index.tsx [154:298]


  init(chart: Chart, config: WlineboxConfig, data: ChartData) {
    const rawLineData: DataAdapterData[] = [];
    this.rawLineData = rawLineData;
    const rawBoxData: DataAdapterData[] = [];
    this.rawBoxData = rawBoxData;

    (data || []).forEach((d: DataAdapterData) => {
      if (d.type === 'line') {
        rawLineData.push(d);
      } else if (d.type === 'box') {
        rawBoxData.push(d);
      }
    });

    const lineData = highchartsDataToG2Data(rawLineData, config as DataAdapterConfig, {});
    const boxData = highchartsDataToG2Data(rawBoxData, config as DataAdapterConfig, {});

    const defs: Record<string, Types.ScaleOption> = {
      x: propertyAssign(
        propertyMap.axis,
        {
          type: 'cat',
          // fix 更新数据时x轴无法清除数据
          sync: true,
        },
        config.xAxis,
      ),
      type: {
        type: 'cat',
      },
    };

    // 双轴
    if (Array.isArray(config.yAxis)) {
      config.yAxis.forEach((axis, yIndex) => {
        defs[`y${yIndex}`] = propertyAssign(
          propertyMap.axis,
          {
            type: 'linear',
            tickCount: 5,
            nice: true,
          },
          axis,
        );
      });
    } else {
      defs.y = propertyAssign(
        propertyMap.axis,
        {
          type: 'linear',
          tickCount: 5,
          // 单轴时,必须同步度量,否则会两个度量叠加在一起
          sync: true,
          nice: true,
        },
        config.yAxis,
      );
    }

    autoTimeScale(defs, this.rawData, this.language || this.context.language);

    chart.scale(defs);

    // 设置X轴
    rectXAxis(this, chart, config);

    if (Array.isArray(config.yAxis)) {
      config.yAxis.forEach((axis, yIndex) => {
        const axisColor = themes['widgets-axis-line'];
        const yAxisConfig: Types.AxisCfg = {
          line: {
            style: {
              stroke: axisColor,
            },
          },
        };
        if (yIndex !== 0) {
          yAxisConfig.grid = null;
          // 因为是多个view组成的图表,所以这里需要移动位置
          yAxisConfig.position = 'right';
        }

        rectYAxis(this, chart, { ...config, yAxis: axis }, `y${yIndex}`, yAxisConfig);
      });
    } else {
      // 设置单个Y轴
      rectYAxis(this, chart, config as { yAxis: (Types.ScaleOption & YAxisConfig) | false });
    }

    rectTooltip(this, chart, config, {}, null, {
      showCrosshairs: false,
      showMarkers: false,
    });

    // 正式开始绘图,创建两个不同的view
    const boxView = chart.createView({
      padding: config.padding === 'auto' ? 'auto' : 0,
    });
    boxView.data(boxData);
    this.boxView = boxView;

    // Tooltip 背景区域
    activeRegionWithTheme(boxView);

    const lineView = chart.createView({
      padding: config.padding === 'auto' ? 'auto' : 0,
    });
    lineView.data(lineData);
    this.lineView = lineView;
    // 关闭一个View的X轴,避免重叠字体变粗
    lineView.axis('x', false);

    if (Array.isArray(config.yAxis)) {
      config.yAxis.forEach((asix, yIndex) => {
        if (getDataIndexColor(config.boxColors, rawBoxData, yIndex)) {
          drawBox(boxView, config, `y${yIndex}`, 'type');
        }
        if (getDataIndexColor(config.lineColors, rawLineData, yIndex)) {
          drawLine(lineView, config, `y${yIndex}`, 'type');
        }
      });
    } else {
      // 单Y轴时同时关闭一个View的Y轴,避免重叠字体变粗
      lineView.axis('y', false);

      drawBox(boxView, config, 'y', 'type');
      drawLine(lineView, config, 'y', 'type');
    }

    // 绘制辅助线,辅助背景区域
    // viewGuide(config, lineView, rawLineData, boxView, rawBoxData);

    legendFilter(this, boxView, 'rawBoxData');
    legendFilter(this, lineView, 'rawLineData');

    rectLegend(
      this,
      chart,
      config,
      {
        items: getLegendItems(rawLineData, rawBoxData, lineView.geometries[0], boxView.geometries[0], config),
      },
      'multiple',
    );
  }