美文网首页
canvas 等比例线状图(可输入编辑)

canvas 等比例线状图(可输入编辑)

作者: ThisWu | 来源:发表于2019-03-15 10:26 被阅读0次

    注释:
    最开始接到一个需求,画一个线状图,因为跟我对接的人比较随性,就简单给我看了一眼之后并没有跟我过多的交代。所以果断选择了百度的ECharts,下面就是效果图

    ECharts线状图.gif

    百度的ECharts其实各方面真的很牛逼,这里点赞。

    但是这边收到,只能显示给出xy值,而且等比缩放。此处当时一万只草泥马心中呼啸而过~~~
    终始心中再多不愿,但是还是得做啊,然后还是看效果图吧。

    canvas 等比例线状图.gif

    弹框直接用css写了,至于canvas,哎,对于小白来说,还是。。。(还是贴下canvas代码)

      function canvas () {
    let dataJson = {
        'chartDef': {
            'lines': [{
                'nodes': [{
                    'xCell': {
                        'name': 'D6',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': '05849ff7-912a-46e8-8353-9a78f5d287d5',
                        'dependCellNames': []
                    },
                    'yCell': {
                        'name': 'D7',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': '8831344f-df51-4406-8147-97a8fa1b8321',
                        'dependCellNames': []
                    }
                }, {
                    'xCell': {
                        'name': 'H6',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': 'd5bc4860-447b-4d9e-a04d-35a1a8e2bd32',
                        'dependCellNames': []
                    },
                    'yCell': {
                        'name': 'H7',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': 'f7b72758-1a38-471b-9b4b-64c80ef01dc0',
                        'dependCellNames': []
                    }
                }, {
                    'xCell': {
                        'name': 'L6',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': '3328a37c-d52c-4e84-9f67-6eb35a4704a2',
                        'dependCellNames': []
                    },
                    'yCell': {
                        'name': 'L7',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': 'd676ac3a-02b1-481c-b457-c3763cca694b',
                        'dependCellNames': []
                    }
                }, {
                    'xCell': {
                        'name': 'P6',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': 'b516b026-0e85-4f8e-8486-7353586a9604',
                        'dependCellNames': []
                    },
                    'yCell': {
                        'name': 'P7',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': '171c2575-0cbf-4f74-9f88-05d18c979981',
                        'dependCellNames': []
                    }
                }, {
                    'xCell': {
                        'name': 'T6',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': '380e2f84-2679-4461-b6cb-1d5f3d37ffd4',
                        'dependCellNames': []
                    },
                    'yCell': {
                        'name': 'T7',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': 'fe89d0f0-86f3-450d-b399-76a3a5830b2a',
                        'dependCellNames': []
                    }
                }], 'lineColor': 'red'
            }, {
                'nodes': [{
                    'xCell': {
                        'name': 'D6',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': '05849ff7-912a-46e8-8353-9a78f5d287d5',
                        'dependCellNames': []
                    },
                    'yCell': {
                        'name': 'F7',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': '780a2956-3c74-49f3-a9c8-2a0e9987a5d8',
                        'dependCellNames': []
                    }
                }, {
                    'xCell': {
                        'name': 'H6',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': 'd5bc4860-447b-4d9e-a04d-35a1a8e2bd32',
                        'dependCellNames': []
                    },
                    'yCell': {
                        'name': 'J7',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': '88d70134-2a47-4c28-83dd-3f6128801d84',
                        'dependCellNames': []
                    }
                }, {
                    'xCell': {
                        'name': 'L6',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': '3328a37c-d52c-4e84-9f67-6eb35a4704a2',
                        'dependCellNames': []
                    },
                    'yCell': {
                        'name': 'N7',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': '51f25018-95ab-4124-9489-e3dae4c32074',
                        'dependCellNames': []
                    }
                }, {
                    'xCell': {
                        'name': 'P6',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': 'b516b026-0e85-4f8e-8486-7353586a9604',
                        'dependCellNames': []
                    },
                    'yCell': {
                        'name': 'R7',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': '2809f3f2-be48-45d9-b7a3-8a6e468455fe',
                        'dependCellNames': []
                    }
                }, {
                    'xCell': {
                        'name': 'T6',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': '380e2f84-2679-4461-b6cb-1d5f3d37ffd4',
                        'dependCellNames': []
                    },
                    'yCell': {
                        'name': 'V7',
                        'pageid': 'S5999_9090_15511609586330678',
                        'cellid': 'c8e1864c-fb31-4e3e-8ce5-3fb15386eb11',
                        'dependCellNames': []
                    }
                }], 'lineColor': 'black'
            }], 'needGetCross': false, 'xName': 'x轴', 'yName': 'y轴'
        }
    }
    let arrData = dataJson.chartDef.lines, colors = [], series = [], arrX = [], maxNum = []
    for (let i = 0; i < arrData.length; i++) {
        colors.push(arrData[i].lineColor)       //添加颜色
        arrX.push([])                           //获取y轴坐标值
        series.push({data:[]})
        for (let j = 0; j < arrData[i].nodes.length; j++) {
            arrX[i].push(parseFloat($('#' + arrData[i].nodes[j].xCell.cellid).html()))
            series[i].data.push($('#' + arrData[i].nodes[j].yCell.cellid).html())
            maxNum.push($('#' + arrData[i].nodes[j].yCell.cellid).html())
        }
    }
    
    let data = series, max = getMaxNum(data[0].data), min = getMinNum(data[0].data)
    
    document.getElementById('container').style.width = window.screen.wdith + 'px'
    let padding = 30
    let width = $(window).width() - padding
    let height = 300
    document.getElementById('canvas').setAttribute('width', width)
    document.getElementById('canvas').setAttribute('height', height)
    let num = parseInt((width - (2 * padding)) / 12)
    var pointX = []
    /*X*/
    for (let i = 0; i < num; i++) {
        pointX.push(padding + i * width / num)
    }
    var pointY = []
    for (let i = 0; i < num; i++) {
        pointY.push(height - padding - i * height / num)
    }
    
    var canvas = document.getElementById('canvas').getContext('2d')
    
    function drawX () {   //x轴网格线 和 xy坐标线
        for (var i = 1; i < pointY.length; i++) {
            canvas.beginPath()
            if (i == pointY.length - 1) {
                canvas.strokeStyle = '#000'
                canvas.moveTo(pointX[0], height - padding)
                canvas.lineTo(pointX[pointY.length - 1], height - padding)
                canvas.moveTo(pointX[0], height - padding)
                canvas.lineTo(pointX[0], 0)
    
            } else {
                canvas.strokeStyle = '#ccc'
                canvas.moveTo(pointX[0], pointY[i])
                canvas.lineTo(pointX[pointY.length - 1], pointY[i])
            }
            canvas.closePath()
            canvas.lineWidth = 1
            canvas.stroke()
        }
    
    }
    
    drawX()
    
    function drawY () {    //y轴网格线
        for (var i = 1; i < pointX.length; i++) {
            canvas.beginPath()
            canvas.strokeStyle = '#ccc'
            for (var i = 1; i < pointX.length; i++) {
                canvas.moveTo(pointX[i], height - padding)
                canvas.lineTo(pointX[i], 0)
            }
            canvas.closePath()
            canvas.lineWidth = 1
            canvas.stroke()
        }
    }
    
    drawY()
    
    function drawZ () {   //尺标线
        maxNum = getMaxNum(maxNum)
        canvas.font = '16px Arial'
        for (let i = 0; i < arrX.length; i++) {
            canvas.beginPath()
            canvas.strokeStyle = colors[i]
            canvas.fillStyle = colors[i]
            let arr = arrX[i],
                maxX = getMaxNum(arr),          //x轴坐标最大值
                minX = getMinNum(arr),          //x轴坐标最小值
                sumX = maxX - minX,             //x轴坐标相差值
                pointX = [],
                maxY = getMaxNum(data[i].data),             //Y轴坐标最大值
                minY = getMinNum(data[i].data),             //Y轴坐标最小值
                sumY = maxY - minY,                         //Y轴坐标相差值
                pointY = [];
            //根据已得到的坐标值“重新计算xy轴的每个坐标”
            for (let a = 0; a < arr.length; a++) {
                if (a == 0) {
                    pointX.push((width - padding) * 0)
                } else {
                    pointX.push((width - padding) * ((arr[a] - minX) / sumX).toFixed(2))
                }
                pointY.push((height - padding) - (height - padding) * (data[i].data[a] / maxNum).toFixed(2))
            }
            //根据重新计算的坐标值绘制“线条”和“刻度值”
            for (let j = 0; j < pointX.length; j++) {
                //线
                canvas.arc(pointX[j] + padding, pointY[j], 2,0.5*Math.PI,true)
                canvas.moveTo(pointX[j] + padding, pointY[j])
                canvas.lineTo(pointX[j + 1] + padding, pointY[1 + j])
                //字
                canvas.fillText(data[i].data[j], 0, pointY[j] + 16)
                canvas.fillText(arr[j], pointX[j] + 10, height - 10)
            }
            canvas.closePath()
            canvas.stroke()
            canvas.lineWidth = 1
            canvas.stroke()
        }
    }
    drawZ()
     }
    //获取最大数
      function getMaxNum (arr) {
    // 将数组第一个元素的值赋给max
    var max = parseFloat(arr[0])
    // 使用for 循环从数组第一个值开始做遍历
    for (var i = 1; i < arr.length; i++) {
        // 如果元素当前值大于max,就把这个当前值赋值给max
        if (parseFloat(arr[i]) > parseFloat(max)) {
            max = parseFloat(arr[i])
        }
    }
    // 返回最大的值
    return max
    }
    //获取最小数
    function getMinNum (arr) {
    // 将数组第一个元素的值赋给min
    var min = parseFloat(arr[0])
    // 使用for 循环从数组第一个值开始做遍历
    for (var i = 1; i < arr.length; i++) {
        // 如果元素当前值小于min,就把这个当前值赋值给min
        if (parseFloat(arr[i]) < parseFloat(min)) {
            min = parseFloat(arr[i])
        }
    }
    // 返回最小的值
    return min
    }
    

    这是根据自己的代码编写,比如json数据,和获取数据的方式,只取这么一段代码无法完全显示最终效果。有需要的请自己去做出改动。

    想获取代码请点击>>canvas 等比例线状图(可输入编辑)

    相关文章

      网友评论

          本文标题:canvas 等比例线状图(可输入编辑)

          本文链接:https://www.haomeiwen.com/subject/ezbkmqtx.html