背景

基于Mixed Chart(柱状图+折线)作图,显示 某维度A Top10 + '其他' 数据,接口返回了值为 undefined  的某维度A 数据,前端渲染成 某维度A 值为 

Superset二次开发之优化Mixed Chart 混合图(柱状图+折线)_数据

此图表存在的问题:

  1. 图表控件编辑页面,即便数据集正常查询出 Top10 + ‘其他’ 数据,但是堆积图表渲染时,返回了 值为 0
  2. 比如'2016'年,正常情况下,有数据集【‘a’:22,‘b’:23,‘c’:24,‘d’:25,‘e’:26】,但是渲染时,显示【‘a’:22,‘f’:0,‘c’:24,‘d’:25,‘g’:0】,显然,2016年真正的完整的数据并没有显示出来

修复

  • superset-frontend\plugins\plugin-chart-echarts\src\MixedTimeseries\transformProps.ts
定位transformProps 函数: function transformProps 
======================================================
// ---------新增以下逻辑----------
  // 过滤掉 data1 中的 NULL 数据
  const filteredData1 = data1.map(item => {
    return Object.fromEntries(
      Object.entries(item).filter(([_, value]) => value !== null)
    );
  });
  const xAxisData = data1.map(item => item[xAxisLabel]); // 从 data1 中提取 x 轴数据,传给x轴,解决x 轴标签错乱
  const rebasedDataA = rebaseForecastDatum(filteredData1, verboseMap); //data1 替换为filteredData1

定位echartOptions参数:const echartOptions: EChartsCoreOption =
======================================================
xAxis: {
    data: xAxisData, // 新增:指定 xAxis 的数据
  • superset-frontend\plugins\plugin-chart-echarts\src\utils\forecast.ts
定位rebaseForecastDatum函数: function rebaseForecastDatum

 // const keys = data.length ? Object.keys(data[0]) : []; 
  //解决不同年份的维度数据不一致情况下,取出完整的keys
  const keys = Array.from(new Set(data.flatMap(row => Object.keys(row))));


  // newRow[verboseKey] = value; 
  // 过滤掉undefined 的维度数据
  if (value !== null && value !== undefined) {
        newRow[verboseKey] = value;
  }
  • superset-frontend\plugins\plugin-chart-echarts\src\utils\series.ts
定位sortAndFilterSeries 函数: function sortAndFilterSeries

  // const seriesNames = Object.keys(rows[0])
  const seriesNames = Array.from(new Set(rows.flatMap(row => Object.keys(row))))


定位finalSeries参数: const finalSeries = sortedSeries.map(name => ({

        if(row[name] === undefined){
          return null;
        } //新增:过滤掉维度值为undefined 的数据
        const currentValueSplit = row[name]?.toString().split(';'); //保持不变



       .filter(obs => obs !== null) // 新增:过滤掉空数据
       .filter(obs => !removeNulls || (obs[0] !== null && obs[1] !== null))//保持不变