Chart.js 获取图表上当前可见点的数组

Chart.js get array of currently visible points on graph

在启用 zoom/pan 的情况下使用 Chart.js,我正在尝试编写一个函数以仅将 canvas 上可见的内容导出到 CSV。

但我不知道如何只获取用户 zooms/pans 之后的可见数据点。

我知道我可以只查看 myChart.data.datasets,但这会获取图表中的所有点,而不仅仅是当前可见的点。

var config = {
    type: 'line',
    data: {
        // data is from API call
    }
        pan: {
            enabled: true,
            mode: 'xy'
        },
        zoom: {
            enabled: true,
            mode: 'xy'
        },
        bezierCurve : false
    }
};

var ctx = document.getElementById('myChart').getContext('2d');
window.myChart = new Chart(ctx, config);

$('#exportTheseRunsToCSV').on('click', function() {
    // something like myChart.getVisibleDataPoints() ???
    console.log(chart)
    console.log(chart.data.datasets)
});

必须有一些内部 API 调用来获取可见点,因为我还有一个将当前可见点导出到 PNG 的功能,并且只抓取当前在 [=30 上绘制的内容=]:

<a id="exportTheseRuns" class="text-white" href="#" download="image.png" download><i class="fas fa-download"></i> Export to PNG</a>

$('#exportTheseRuns').on('click', function() {
    $('#exportTheseRuns').attr('href', myChart.toBase64Image());
})

函数 .toBase64Image() 似乎它在内部做我正在寻找的事情,因为它只会捕获可见点,但它 returns 一个我不能用于我的 Base64 URI arrayToCSV 函数。

toBase64Image 函数不是您想要的,它只是从 canvas.

获取数据 URL

toBase64Image on github.com/chartjs

toBase64Image: function() {
  return this.canvas.toDataURL.apply(this.canvas, arguments);
},

您可以使用 onZoomCompleteonPanComplete 获取更新的图表数据,它们都获取一个包含 chart 的对象,您可能会从中获取有关当前缩放的更多信息,但是据我所知,您需要做一些 calculations/work 来获得可见点...

图表对象包含 minIndexmaxIndex 属性,可用于 slice 可见值的数据集。

下面是一个片段,展示了如何使用 plugin-provided functions onPanComplete and onZoomComplete 在平移或缩放图表后输出可见值:

function getVisibleValues({
  chart
}) {
  let x = chart.scales["x-axis-0"];

  document.getElementById("vv").innerText = JSON.stringify(chart.data.datasets[0].data.slice(x.minIndex, x.maxIndex + 1));
}

new Chart(document.getElementById("chart"), {
  type: "line",
  data: {
    labels: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'],
    datasets: [{
      data: [0, 1, 2, 4, 8, 16, 32, 64, 128, 256]
    }]
  },
  options: {
    maintainAspectRatio: false,
    scales: {
      xAxes: [{
        ticks: {
          min: 'c',
          max: 'h'
        }
      }]
    },
    plugins: {
      zoom: {
        pan: {
          enabled: true,
          mode: 'x',
          onPanComplete: getVisibleValues
        },
        zoom: {
          enabled: true,
          mode: 'x',
          onZoomComplete: getVisibleValues
        }
      }
    }
  }
});
<script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.1"></script>
<script src="https://cdn.jsdelivr.net/npm/hammerjs@2.0.8"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-zoom@0.7.4"></script>
<canvas id="chart" style="max-height:125px"></canvas>
<p>
  Visible values: <span id="vv"></span>
</p>