echarts折线图改变y轴刻度

目前项目有个要求,比如y轴数据大部分在几百,但是有个峰值达到了1W。。这样导致经常出现的几百的数据变化不明显,这时候就需要对y轴数据进行处理,将不经常出现的数据范围进行缩小,比如1-500和500-5000的间距变为一样,这样就可以方便看到数据的变化了。
针对两个问题有两种解决方法:
1. 不要求y轴数据的规律,这时候可以用开立方缩小数据的间隙。

https://blog.csdn.net/WanweI897/article/details/121271044?ops_request_misc=&request_id=&biz_id=102&utm_term=echarts%E8%AE%BE%E7%BD%AE%E4%B8%8D%E5%9D%87%E5%8C%80%E5%88%BB%E5%BA%A6&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-121271044.nonecase&spm=1018.2226.3001.4187

2.要求y轴数据间隙有一定规律
参考

//折线图坐标点算法
//需求:100 200 500 1000 1500 2000...
function initPointData(pointData, max, min) {
    //第一个分界点
    var part1 = 200;
    //第二个分界点
    var part2 = 500;
    //单个间隔
    var inter = 100;
    //前两段间隔
    var twoInter = 300;
    //最后一段间隔
    var lastInter = 500;
    //最大刻度
    if (max > 0) {
        var maxNum = (max / 500 + 1) * 500;
    } else {
        var maxNum = 0;
    }
    if (min < 0) {
        var minNum = -(Math.abs(min / 500) + 1) * 500;
    } else {
        var minNum = 0;
    }
    var returnPosition = 0;  //初始化返回的值*
    //判断当前值范围,不同区间范围计算多余占比,加上之前实际的间隙
    if (pointData <= part1 && pointData >= -part1) {
        returnPosition = pointData;
    } else if (pointData > part1 && pointData <= part2) {
        returnPosition = (pointData - part1) / (part2 - part1) * inter + part1;
    } else if (pointData > part2 && pointData <= maxNum) {
        returnPosition = (pointData - part2) / (maxNum - part2) * ((maxNum - part2) / lastInter) * inter + twoInter;
        console.log((pointData - part2) / (maxNum - part2) * (maxNum / lastInter) * inter)
    } else if (pointData < -part1 && pointData >= -part2) {
        //
        returnPosition = Math.abs(parseFloat(pointData) + part1) / (part1 - part2) * inter - part1;
        console.log(Math.abs(parseFloat(pointData) + part1) / (part1 - part2) * inter)
    } else if (pointData < -part2 && pointData >= minNum) {    //-500 - -1500
        returnPosition = (parseFloat(pointData) + part2) / Math.abs(minNum + part2) * (Math.abs(minNum + part2) / lastInter) * inter - twoInter;
    } else {
        returnPosition = pointData;
    }
    return returnPosition
}

function getData(temp) {
    var jsonString = [];
    for (var i = 0; i < temp.length; i++) {
        var json = {};
        var seaMax = searchMax(temp);
        var seaMin = searchMin(temp);
        json.name = temp[i];
        json.value = initPointData(temp[i], seaMax, seaMin);
        jsonString.push(json);
    }
    return jsonString;
}

function searchMax(arr) {
    var maxNumber = Math.max.apply(null, arr);
    return maxNumber;
}

function searchMin(arr) {
    var minNumber = Math.min.apply(null, arr);
    return minNumber;
}

//极值绘制曲线
function echartsDemo(elementid, title) {
	var datas = {
        xAxis: [123, 456, 789, 576, 423, 425], yAxis1: [123, 456, 789, 576, 423, 425], yAxis2: [742, 842, 126, 586, 485, 523]
    }
    var dom = document.getElementById(elementid);
    var myChart = echarts.init(dom);
    //获取两个曲线的最大最小值
    var seaMax1 = searchMax(datas.yAxis1);
    var seaMin1 = searchMin(datas.yAxis1);
    var seaMax2 = searchMax(datas.yAxis2);
    var seaMin2 = searchMin(datas.yAxis2);
    var totalMax = seaMax1 > seaMax2 ? seaMax1 : seaMax2;
    var totalMin = seaMin1 > seaMin2 ? seaMin2 : seaMin1;
    option = {
        title: {
            text: title,
            show: true,
            top: '0',

        },
        tooltip: {
            type: 'line',
            trigger: 'axis',
            formatter: function (params) {
                var result = ''
                var axisName = ''
                params.forEach(function (item) {
                    axisName = item.axisValue
                    var itemValue = item.marker + item.seriesName + ": " + item.data.name + "</br>"
                    result += itemValue
                })
                var allResult = result + "</br>" + axisName
                return allResult
            },
            axisPointer: {
                lineStyle: {
                    type: 'dotted',
                    color: 'red',
                    width: 2,
                },
                animation: false
            },
            textStyle: {
                fontSize: 10,
                color: 'white',
                decoration: 'none'
            }
        },
        legend: {
            data: ['111', '222']
        },
        xAxis: {
            name: 'Time',
            nameLocation: 'center',
            nameTextStyle: {
                color: "gray",
                fontSize: 10,
                padding: 10
            },
            splitLine: {
                show: false
            },
            type: 'category',
            data: datas.xAxis,
        },
        yAxis: {
            type: 'value',
            interval: 100,
            max: function (value) {//取最大值向上取整为最大刻度
                if (totalMax > 0) {
                    return (parseInt(totalMax / 500)) * 100 + 300;
                } else {
                    return 0;
                }
            },
            min: function (value) {//取最小值向下取整为最小刻度
                if (totalMin < 0) {
                    return (parseInt(totalMin / 500)) * 100 - 300;
                } else {
                    return 0;
                }
            },
            splitLine: {
                show: true,
            },
            minInterval: 100, //这个可自己设置刻度间隔
            axisLabel: {
                formatter: function (value, index) {  //Y轴的自定义刻度值,对应上图
                    //最大值最小值都大于0
                    if (totalMax >= 0 && totalMin >= 0) {
                        var interNum1 = parseInt(totalMax / 500);
                        var numAll = interNum1;
                        if (index == 0) {
                            value = 0
                        } else if (index == 1) {
                            value = 100
                        } else if (index == 2) {
                            value = 200
                        } else if (index == 3) {
                            value = 500
                        }
                        for (var i = numAll; i > 0; i--) {
                             if (index == i + 3) {
                                 value = 500 + i * 500
                            }
                        }
                        return value;
                    }
                    //最大值最小值都小于0
                    if (totalMax < 0 && totalMin < 0) {
                        var interNum2 = parseInt(Math.abs(totalMin / 500));
                        var numAll = interNum2;
                        for (var i = 0; i < interNum2; i++) {
                            if (index == i) {
                                value = -500 * (interNum2 - (i - 1));
                            }
                        }
                        if (index == interNum2) {
                            value = -500
                        } else if (index == interNum2 + 1) {
                            value = -200
                        } else if (index == interNum2 + 2) {
                            value = -100
                        } else if (index == interNum2 + 3) {
                            value = 0
                        }
                        return value;
                    }
                    //最大值大于0,最小值小于0
                    if (totalMax > 0 && totalMin < 0) {
                        var interNum1 = parseInt(totalMax / 500);
                        var interNum2 = parseInt(Math.abs(totalMin / 500));
                        for (var i = 0; i < interNum2; i++) {
                            if (index == i) {
                                value = -500 * (interNum2 - (i - 1))
                            }
                        }
                        if (index == interNum2) {
                            value = -500
                        } else if (index == interNum2 + 1) {
                            value = -200
                        } else if (index == interNum2 + 2) {
                            value = -100
                        } else if (index == interNum2 + 3) {
                            value = 0
                        } else if (index == interNum2 + 4) {
                            value = 100
                        } else if (index == interNum2 + 5) {
                            value = 200
                        } else if (index == interNum2 + 6) {
                            value = 500
                        }
                        for (var i = 0; i < interNum1; i++) {
                            if (index == interNum2 + 7 + i) {
                                value = 500 * (i + 2)
                                console.log(value)
                            }
                        }
                        return value;
                    }
                }
            }
        },
        series: [
        {
            name: '111',
            type: 'line',
            animation: false,
            lineStyle: {
                normal: {
                    width: 1
                }
            },
            data: getData(datas.yAxis1)

        }, {
            name: '222',
            type: 'line',
            animation: false,
            lineStyle: {
                normal: {
                    width: 1
                }
            },
            data: getData(datas.yAxis2)
        }
        ],

    }
    myChart.clear();
    myChart.setOption(option);
}

效果图:100,200,500,1000
请添加图片描述


版权声明:本文为q4451728原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。