隐藏系列时重新缩放 google 折线图 X 轴

Rescale google line chart X axis when a series is hidden

当使用此代码单击图例时,我在 google 折线图中 hiding/showing 系列:

    var columns = [];
    var series = {};
    for (var i = 0; i < data.getNumberOfColumns(); i++) {
      columns.push(i);
      if (i > 0) {
        series[i - 1] = {};
      }
    }

    google.visualization.events.addListener(chart, 'select', function () {
        var sel = chart.getSelection();
        // if selection length is 0, we deselected an element
        if (sel.length > 0) {
            // if row is undefined, we clicked on the legend
            if (sel[0].row === null) {
                var col = sel[0].column;
                if (columns[col] == col) {
                    // hide the data series
                    columns[col] = {
                        label: data.getColumnLabel(col),
                        type: data.getColumnType(col),
                        calc: function () {
                            return null;
                        }
                    };

                    // grey out the legend entry
                    series[col - 1].color = '#CCCCCC';
                }
                else {
                    // show the data series
                    columns[col] = col;
                    series[col - 1].color = null;
                }
                var view = new google.visualization.DataView(data);
                view.setColumns(columns);
                chart.draw(view, burndown_options);
            }
        }
    });

隐藏系列时,Y 轴会自动重新缩放。有没有办法让 X 轴重新缩放?

这是一个包含我的代码和数据的 jsfiddle:http://jsfiddle.net/LarryMartell/my906Lw2/5/

尽管可以通过返回 null
将列排除在视图中 所有行仍然存在,
这就是 x 轴不变的原因。

我们必须排除所有值为空的行,
为了重新缩放 x 轴。

// exclude rows where all columns = null
var rows = [];
var validRow;
for (var r = 0; r < view.getNumberOfRows(); r++) {
  validRow = null;
  for (var c = 1; c < view.getNumberOfColumns(); c++) {
    validRow = validRow || view.getValue(r, c);
  }
  if (validRow !== null) {
    rows.push(r);
  }
}
view.setRows(rows);

请参阅以下工作片段...

google.charts.load('current', {
  packages: ['corechart']
}).then(drawChart);

function drawChart() {
  var data = new google.visualization.DataTable();
  data.addColumn('string', 'Day');
  data.addColumn('number', 'S1');
  data.addColumn('number', 'S2');
  data.addColumn('number', 'S3');
  data.addColumn('number', 'S4');
  data.addColumn('number', 'S5');
  data.addColumn('number', 'S6');
  var rows = [
    ["Nov 2019", null, null, 92617.19, null, 92617.19, null],
    ["Dec 2019", null, null, 92617.19, null, 92617.19, null],
    ["Jan 2020", 3251.84, 16259.2, 92617.19, 2002.02, 94619.2, null],
    ["Feb 2020", 3251.84, 16259.2, 92617.19, 4004.03, 96621.22, null],
    ["Mar 2020", 6503.68, 32518.4, 92617.19, 8008.06, 100625.25, null],
    ["Apr 2020", 6503.68, 32518.4, 92617.19, 12012.1, 104629.28, null],
    ["May 2020", 6503.68, 32518.4, 83355.47, 16016.13, 99371.59, null],
    ["Jun 2020", 13007.36, 65036.81, 74093.75, 24024.19, 98117.94, null],
    ["Jul 2020", 13007.36, 65036.81, 64832.03, 32032.26, 96864.29, null],
    ["Aug 2020", 13007.36, 65036.81, 55570.31, 40040.32, 95610.63, null],
    ["Sep 2020", 13007.36, 65036.81, 46308.59, 48048.38, 94356.98, null],
    ["Oct 2020", 13007.36, 65036.81, 37046.87, 56056.45, 93103.32, null],
    ["Nov 2020", 13007.36, 65036.81, 18523.44, 64064.51, 82587.95, null],
    ["Dec 2020", 13007.36, 65036.81, 13892.58, 72072.58, 85965.15, null],
    ["Jan 2021", 13007.36, 65036.81, 11114.06, 80080.64, 91194.7, null],
    ["Feb 2021", null, null, null, 80080.64, null, 650368.08],
    ["Mar 2021", null, null, null, 80080.64, null, 637831.53],
    ["Apr 2021", null, null, null, 80080.64, null, 625294.99],
    ["May 2021", null, null, null, 80080.64, null, 612758.44],
    ["Jun 2021", null, null, null, 80080.64, null, 600221.89],
    ["Jul 2021", null, null, null, 80080.64, null, 587685.35],
    ["Aug 2021", null, null, null, 80080.64, null, 575148.8],
    ["Sep 2021", null, null, null, 80080.64, null, 562612.26],
    ["Oct 2021", null, null, null, 80080.64, null, 550075.71],
    ["Nov 2021", null, null, null, 80080.64, null, 537539.16],
    ["Dec 2021", null, null, null, 80080.64, null, 525002.62],
    ["Jan 2022", null, null, null, 80080.64, null, 512466.07],
    ["Feb 2022", null, null, null, 80080.64, null, 499929.52],
    ["Mar 2022", null, null, null, 80080.64, null, 487392.98],
    ["Apr 2022", null, null, null, 80080.64, null, 474856.43],
    ["May 2022", null, null, null, 80080.64, null, 462319.89],
    ["Jun 2022", null, null, null, 80080.64, null, 449783.34],
    ["Jul 2022", null, null, null, 80080.64, null, 437246.79],
    ["Aug 2022", null, null, null, 80080.64, null, 424710.25],
    ["Sep 2022", null, null, null, 80080.64, null, 412173.7],
    ["Oct 2022", null, null, null, 80080.64, null, 399637.15],
    ["Nov 2022", null, null, null, 80080.64, null, 387100.61],
    ["Dec 2022", null, null, null, 80080.64, null, 374564.06],
    ["Jan 2023", null, null, null, 80080.64, null, 362027.52],
    ["Feb 2023", null, null, null, 80080.64, null, 349490.97],
    ["Mar 2023", null, null, null, 80080.64, null, 336954.42],
    ["Apr 2023", null, null, null, 80080.64, null, 324417.88],
    ["May 2023", null, null, null, 80080.64, null, 311881.33],
    ["Jun 2023", null, null, null, 80080.64, null, 299344.78],
    ["Jul 2023", null, null, null, 80080.64, null, 286808.24],
    ["Aug 2023", null, null, null, 80080.64, null, 274271.69],
    ["Sep 2023", null, null, null, 80080.64, null, 261735.14],
    ["Oct 2023", null, null, null, 80080.64, null, 249198.6],
    ["Nov 2023", null, null, null, 80080.64, null, 236662.05],
    ["Dec 2023", null, null, null, 80080.64, null, 224125.51],
    ["Jan 2024", null, null, null, 80080.64, null, 211588.96],
    ["Feb 2024", null, null, null, 80080.64, null, 199052.41]
  ];
  data.addRows(rows);

  options = {
    hAxis: {
      title: '',
      slantedText: true,
      slantedTextAngle: 90
    },
    vAxis: {
      title: '',
      format: '$#,###'
    },
    title: "",
    width: 800,
    height: 500,
    isStacked: "true",
    pointSize: 5,
    legend: {
      position: 'bottom'
    },
    interpolateNulls: true,
    vAxis: {
      format: 'currency'
    }
  };

  chart = new google.visualization.LineChart(document.getElementById('chart_div'));
  chart.draw(data, options);

  var columns = [];
  var series = {};
  for (var i = 0; i < data.getNumberOfColumns(); i++) {
    columns.push(i);
    if (i > 0) {
      series[i - 1] = {};
    }
  }

  options['series'] = series;

  google.visualization.events.addListener(chart, 'select', function() {
    var sel = chart.getSelection();
    // if selection length is 0, we deselected an element
    if (sel.length > 0) {
      // if row is undefined, we clicked on the legend
      if (sel[0].row === null) {
        var col = sel[0].column;
        if (columns[col] == col) {
          // hide the data series
          columns[col] = {
            label: data.getColumnLabel(col),
            type: data.getColumnType(col),
            calc: function() {
              return null;
            }
          };

          // grey out the legend entry
          series[col - 1].color = '#CCCCCC';
        } else {
          // show the data series
          columns[col] = col;
          series[col - 1].color = null;
        }
        var view = new google.visualization.DataView(data);
        view.setColumns(columns);

        // exclude rows where all columns = null
        var rows = [];
        var validRow;
        for (var r = 0; r < view.getNumberOfRows(); r++) {
          validRow = null;
          for (var c = 1; c < view.getNumberOfColumns(); c++) {
            validRow = validRow || view.getValue(r, c);
          }
          if (validRow !== null) {
            rows.push(r);
          }
        }
        view.setRows(rows);

        chart.draw(view, options);
      }
    }
  });
}
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_div"></div>


注意: jsfiddle 使用旧版本的 google 图表。

jsapi 加载程序已过时,不应再使用。

改为使用loader.js,这只会改变load语句。
见上面的片段...