1. Highcharts

2. echarts

  • 散点图,100万个点官方示例(https://echarts.apache.org/examples/zh/editor.html?c=scatter-nebula)
  • 本地Demo实测(boost高性能模式,非WebGL渲染器),100万个点,可以在1s内渲染出来,但是因为点是分批异步渲染的,所以在滚动等图表刷新视图的时候,画面会有明显闪烁;最致命的问题是,添加圈选之后,再进行滚动或缩放等交互会非常卡,而且图中会丢失大量点数据,几乎是不可用的状态。
  • 页面缩放到150%以上后清晰度下降较为明显。

3. AntV/G2

4. LightningChart.js

5. Chart.js

6. Plotly.js

  • 散点图,非大数据量官方示例(https://plotly.com/javascript/line-and-scatter/)
  • 在交互性方面较强,在某些方面可能接近甚至超过echarts,且有MIT License,可商用。
  • 在性能方面,由于可以使用WebGL渲染器,大数据量时的渲染性能和交互流畅度可以远超echarts。
  • 实测页面缩放到200%后图中内容依然清晰。
  • 散点图,本地Demo实测(测试设备:M1 Pro MacBook Pro):
    • 100万个点依然非常流畅,刷选放大响应非常迅速,几乎瞬时响应;
    • 500万个点未圈选时进行缩放的响应时间实测大约0.4s;圈选后依然可以较流畅地进行滚动,圈选后进行缩放的响应时间实测大约1.1s;
    • 1000万个点未圈选时进行缩放的响应时间实测大约0.5s;圈选后进行滚动较为卡顿,略好于100万数据量的echarts的表现,进行缩放的响应时间实测大约2.2s;此时的卡顿估计主要为内存、CPU和GPU等硬件性能的瓶颈,当前标签页堆内存激增到1~2GB左右,CPU和GPU均有60%~100%的占用。
  • 以下是Plotly.js绘制100万个点的散点图Demo:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Plotly.js High-Volume Scatter Plot Demo</title>
    <script src="https://cdn.plot.ly/plotly-2.18.2.min.js"></script>
    </head>
    <body>
    <h2>High-Volume Scatter Plot with Plotly.js (WebGL)</h2>
    <p id="webgl-status"></p>
    <div id="scatter-plot" style="width: 100%; height: 600px;"></div>
    
    <script>
        // 检查 WebGL 支持
        function isWebGLSupported() {
            try {
                const canvas = document.createElement("canvas");
                return !!window.WebGLRenderingContext && 
                       (canvas.getContext("webgl") || canvas.getContext("experimental-webgl"));
            } catch (e) {
                return false;
            }
        }
    
        // 显示 WebGL 支持状态
        const statusElement = document.getElementById('webgl-status');
        if (isWebGLSupported()) {
            statusElement.innerText = "WebGL is supported on this device.";
            statusElement.style.color = "green";
        } else {
            statusElement.innerText = "WebGL is NOT supported on this device.";
            statusElement.style.color = "red";
        }
    
        // 生成100万个随机数据点
        const data = {
            type: 'scattergl', // 使用WebGL渲染模式
            mode: 'markers',
            x: Array.from({ length: 1000000 }, () => Math.random() * 100),
            y: Array.from({ length: 1000000 }, () => Math.random() * 100),
            marker: {
                color: 'rgba(0, 150, 255, 0.6)', // 数据点颜色,带透明度
                size: 3, // 数据点大小
            }
        };
    
        const layout = {
            title: 'Scatter Plot with 1,000,000 Data Points',
            xaxis: { title: 'X Axis' },
            yaxis: { title: 'Y Axis' },
            height: 840
        };
    
        // 创建图表
        Plotly.newPlot('scatter-plot', [data], layout);
    </script>
    </body>
    </html>
  • 需要注意的是,实际渲染性能依赖用户的设备硬件水平,且需要浏览器支持WebGL。

A Student on the way to full stack of Web3.