echarts双折线图标注的文字位置自动上下排序

说明

有时候项目组要求做的一些折线图比较奇葩一点,比如本年每个月的数据和去年的数据进行比较,而且标注的文字要根据数据的大小变化,大的值标注的文字在上面,小的值标注的文字要在下面,这个案例在官方或者论坛上都没有案例,后面经过自己的一些想法和研究,搞了一个案例出来了。废话不多说,直接上干货。

示例图

示例

HTML代码

<div id="main" style="width: 50%;height:400px;margin: 0 auto;"></div>

JS代码

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script src="https://lib.baomitu.com/echarts/5.1.2/echarts.common.js"></script>
<script>
        $(function () {
            var data={
                title:"xxx标题",
                color:["red","blue"],
                x:['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],
                y:[{min:null,max:null,name:"(单位:亿元)"}],
                data:[
                    {
                        name:"本年累计",
                        data:["21","3","38","9","8.5","5","35","25","14","11","9","25"]
                    },
                    {
                        name:"去年累计",
                        data:["13","9.3","9","17","8.5","11.5","9.3","9","17","8.5","27.5","23.666"]
                    }
                ]
            };
            //前端细节区分
            var tip={
                tofiexd:2,//y轴刻度保留2位数小数
                unit:"%",//y轴刻度单位
            }
            drawLine("main","line_auto_up_down",data,tip);
            
        });
        
        /**
         * @func
         * @desc    折线函数
         * @param {string} id - string |目标id
         * @param {string} type - string | line_auto_up_down(双折线,并且排列标记字的位置
         * @param {object} data - 后端数据 @returns {...}
         * @param {object} tip - 前端重定义echar画图细节和区别 @returns {...}
         * 
         */
        function drawLine(id,type,data,tip){
            var myChart = echarts.init(document.getElementById(id));
            var option = {
                backgroundColor:"rgba(10,10,10,0.1)",
                title: {
                    text: "默认标题",
                    x: 'center',
                    top: '5'
                },
                tooltip: {
                    trigger:'axis',
                    confine: true,
                    axisPointer:{
                        type:"line"
                    }
                },
                legend:{
                    show:true,
                    bottom: 15,
                },
                xAxis: {
                    type: 'category',
                    data: ['周一','周二','周三','周四','周五','周六','周日']
                },
                yAxis: [
                    {
                        type: 'value',
                        show: true,
                        min: null,
                        max: null,
                        name:"(单位:xx)",
                        splitLine:{show:false}
                    },
                    {
                        type: 'value',
                        show: false,
                        min: null,
                        max: null,
                        name:"(单位:xx)",
                        splitLine:{show:false}
                    },
                ],
                grid: {
                    left: '4%',
                    right: '4%',
                    bottom: '15%',
                    top:"20%",
                    containLabel: true
                },
                series: []
            }
            //后端传数据源进行处理
            if(data.title){
                option.title.text = data.title;
            }
            if(data.color){
                var arrColor = data.color;
                option.color = arrColor;
            }
            if(data.x){
                option.xAxis.data = data.x;
            }
            //全局处理设置Y轴刻度单位(默认无单位),显示多少位小数(默认0位)
            var sunit = "",stofixed = 0;
            //前端控制设置
            if(tip){
                if(tip.tofiexd){
                    stofixed = tip.tofiexd
                }
                if(tip.unit){
                    sunit = tip.unit
                }
            }
            for(var mm=0;mm<data.y.length;mm++){
                if( data.y[mm].name){
                    option.yAxis[mm].name = data.y[mm].name;
                }
                if( data.y[mm].min){
                    option.yAxis[mm].min = data.y[mm].min;
                }
                if( data.y[mm].max){
                    option.yAxis[mm].max = data.y[mm].max;
                }
                option.yAxis[mm].axisLabel={
                    formatter: function(val){
                        if(stofixed == 0){
                            return val + sunit;
                        }else{
                            return val.toFixed(stofixed) + sunit;
                        }
                    }
                }
            }
            if(data.y.length > 1){
                //双Y轴处理
                option.yAxis[1].show = true;
            }
            //line_auto_up_down标注文字上下自动排序显示类型处理
            if(type=="line_auto_up_down"){
                var arrVal1=[],arrVal2=[];
                for(var i=0;i<data.data.length;i++){
                    var val=data.data[i];
                    var tmp={
                            name:val.name,
                            yAxisIndex:0,
                            type:"line",
                            data:[]
                    }
                    for(var j=0;j<val.data.length;j++){
                        var vval={
                            value:val.data[j],
                            label:{show:true},
                        };
                        tmp.data.push(vval)
                    }
                    option.series.push(tmp)
                }
                
                for(var j=0;j<data.data[0].data.length;j++){
                    arrVal1.push(data.data[0].data[j])
                    arrVal2.push(data.data[1].data[j])
                }
                //判断数组大小并进行上下自动显示
                if(arrVal1.length == arrVal2.length){
                    for(var j=0;j<arrVal1.length;j++){
                        var val0 = option.series[0].data[j].value;
                        var val1 = option.series[1].data[j].value;
                        if(Number(val0)>Number(val1) || Number(val0)==Number(val1)){
                            option.series[0].data[j].label.position="top";
                            option.series[1].data[j].label.position="bottom";
                        }else{
                            option.series[0].data[j].label.position="bottom";
                            option.series[1].data[j].label.position="top";
                        }
                    }
                }
            }
            // 画图
            myChart.setOption(option,true);
            myChart.resize();
        }
        </script>
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容