echarts實現多條可拖動節點的折現圖


這篇博文主要是利用echarts實現兩條以及多條可拖動節點的曲線,demo脫胎於官方demo,在官方demo的基礎上添加了另一條曲線。因為之前寫過一篇在vue中使用echarts實現可拖動節點的折線圖,並可配置拖動方向及拖動上下限,所以本篇文章以最簡單的方式說明如何實現多條曲線的可拖動,故不再實現其他配置,如果對上下限和拖動方向需要控制的同學可以參考我的另一篇博文:https://www.cnblogs.com/p-l-u-m/p/10691684.html;同時如果有問題或建議歡迎留言探討。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="https://cdn.bootcss.com/echarts/4.3.0/echarts-en.common.min.js"></script>
</head>

<body>
    <!-- 為ECharts准備一個具備大小(寬高)的Dom -->
    <div id="main" style="width: 600px;height:400px;"></div>
    <script>
        // 基於准備好的dom,初始化echarts實例
        var myChart = echarts.init(document.getElementById('main'));
        var symbolSize = 20;
        var data1 = [[-90, -10], [-30, -10], [10, -20], [30, -10], [60, -10]]; // 第一條線
        var data2 = [[-90, 10], [-30, 10], [10, 20], [30, 10], [60, 10]]; // 第二條線,多天線類推
        var option = { // 基本配置,畫曲線
            title: {
                text: 'Try Dragging these Points'
            },
            /*  tooltip: {
                 triggerOn: 'none',
                 formatter: function (params) {
                     return 'X: ' + params.data[0].toFixed(2) + '<br>Y: ' + params.data[1].toFixed(2);
                 }
             }, */
            grid: {
            },
            xAxis: {
                min: -100,
                max: 80,
                type: 'value',
                axisLine: { onZero: false }
            },
            yAxis: {
                min: -30,
                max: 60,
                type: 'value',
                axisLine: { onZero: false }
            },
            dataZoom: [
                {
                    type: 'slider',
                    xAxisIndex: 0,
                    filterMode: 'empty'
                },
                {
                    type: 'slider',
                    yAxisIndex: 0,
                    filterMode: 'empty'
                },
                {
                    type: 'inside',
                    xAxisIndex: 0,
                    filterMode: 'empty'
                },
                {
                    type: 'inside',
                    yAxisIndex: 0,
                    filterMode: 'empty'
                }
            ],
            series: [
                {
                    id: 'a',
                    type: 'line',
                    smooth: true,
                    symbolSize: symbolSize,
                    data: data1
                },
                {
                    id: 'b',
                    type: 'line',
                    smooth: true,
                    symbolSize: symbolSize,
                    data: data2
                }
            ]
        };
        myChart.setOption(option)
        setTimeout(function () {
            // 在圖上添加圖層
            myChart.setOption({
                graphic:
                    echarts.util.map(data1.concat(data2), function (item, dataIndex) { // 此處需要把兩條曲線的數組拼成一個數組進行遍歷,多條曲線類似
                        return {
                            type: 'circle',
                            position: myChart.convertToPixel('grid', item),
                            shape: {
                                cx: 0,
                                cy: 0,
                                r: symbolSize / 2
                            },
                            invisible: true,
                            draggable: true,
                            ondrag: echarts.util.curry(onPointDragging, dataIndex), // 添加拖動的回調
                            // onmousemove: echarts.util.curry(showTooltip, dataIndex),
                            // onmouseout: echarts.util.curry(hideTooltip, dataIndex),
                            z: 100
                        };
                    })

            });
        }, 0);
        myChart.on('dataZoom', updatePosition); // 這是放大縮小,與本例要說明的無關

        function updatePosition() {
            myChart.setOption({
                graphic: echarts.util.map(data1, function (item, dataIndex) {
                    return {
                        position: myChart.convertToPixel('grid', item)
                    };
                })
            });
        }

        function showTooltip(dataIndex) {
            myChart.dispatchAction({
                type: 'showTip',
                seriesIndex: 0,
                dataIndex: dataIndex
            });
        }

        function hideTooltip(dataIndex) {
            myChart.dispatchAction({
                type: 'hideTip'
            });
        }
        // 拖動的處理函數,因為把所有的曲線數組拼成了一個數組,所以添加的圖層是一個整體,此處需要拆分圖層,還原為兩條曲線
        function onPointDragging(dataIndex, dx, dy) {
            if (dataIndex <= (data1.length - 1)) { // 通過索引判斷此圓圈覆蓋的是哪條曲線
                data1[dataIndex] = myChart.convertFromPixel('grid', this.position); // 將坐標值(x, y)還原為數組的項[a,b]
                // 更新圖表
                myChart.setOption({
                    series: [{
                        id: 'a',
                        data: data1
                    }]
                });
            } else {
                data2[dataIndex - data1.length] = myChart.convertFromPixel('grid', this.position);
                myChart.setOption({
                    series: [{
                        id: 'b',
                        data: data2
                    }]
                });
            }


        }
        function onPointDragging2(dataIndex, dx, dy) {
            data2[dataIndex] = myChart.convertFromPixel('grid', this.position);

            // Update data
            myChart.setOption({
                series: [{
                    id: 'b',
                    data: data2
                }]
            });
        }

    </script>
</body>

</html>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM