定制开发echarts折线图如何防止label重叠,实现一上一下的效果

定制开发网上参考了很多答案,定制开发基本都没用。定制开发问过几个同事也没有现定制开发成的解决方案,定制开发有方案也大多不完美。定制开发我们要实现的效果是label定制开发标签全部显示并实现一上一下,定制开发完成结果如图所示,想了很久,定制开发代码不是很难,定制开发难的是实现的思路。

定制开发花费了一些时间,抱着分享的心态来分享一下心得,希望不要转载
对你有帮助的话麻烦点个赞或收藏,感激,赠人玫瑰,手有余香🌹

如图:

要实现上图的效果,我想过几种思路:

  1. 获取同一坐标轴上的坐标点,然后对比同一纬度的大小给设置positon方式。

    事实证明行不通,首先坐标我查阅文档查了半天也在网上进行搜索,都是答非所问。其次,就算坐标找到了,没有办法直接在option的label里动态设置positon. 官方文档似乎就几种固定的属性,没有看到position有设置回调的方法。

  2. 文档也看了好几遍了,也没发现可以动态设置offset的方式,试过了不行。接下来说可以实现的方式。

  3. 实现思路
    3-1. 在异步获取折线图数据时添加一个标记position,这个标记表示当前数据在图标中的位置是上还是下。
    3-2. 举个例子,用当前值和同期值做对比,如果当前值大于同期值,那么数值应该在上方,反之下方。
    3-3. 有个值得注意的点是,折线图不设置position时默认都是top,所以我们只要对标记为bottom的数值做位置上的处理就行。
    3-4. 最后通过设置padding的方式实现了。

具体实现代码如下:

    const queryCargoTrendData = async (chartParams) => {        try {            lineOption.series[0].data = []            lineOption.series[1].data = []            const { data } = await queryCargoTrend(chartParams)            if (data.records && data.records.length > 0) {            	lineOption.xAxis.data = data.records.map(item => item.dateCode)                data.records.forEach(item => {                    /***                     * 0 注释很重要,必看                     * 1 通过遍历的方式给series的两个数组分别添加 position 标记                     *      position1 表示当月数据在折线图中的上下位置                     *      position2 表示同期数据在折线图中的上下位置                     * 2 添加好标记后去label的formatter格式化函数进行数据处理                     *                     */                    let position1 = item.value > item.valuelwd ? 'top':'bottom'                    let position2 = item.value > item.valuelwd ? 'bottom':'top'                                        /***                     * 3 这里有个注意的地方,如果数据映射到图标,那么必须得有个字段是value,否则不显示,                     * 其他的随便你怎么加,不清楚就按照下面的添加                     */                    lineOption.series[0].data.push({value: item.value, position: position1})                    lineOption.series[1].data.push({value: item.valuelwd, position: position2})                })            }        } catch (e) {}    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

重要的事说一遍,先看注释!,接下来对标记的数据进行处理,完整代码太长,这里只贴有用的部分,如果还有不明白的可以留言问我。

        series: [            {                name: '每日数据',                type: 'line',                color: '#7C25FF',                label: {                    show: true,                    color: colors[0],                    formatter: (params) => { // 实现                        /***                         * data 映射的数据源; value 折线图实际取值; 《如果实在不明白请查阅文档》                         * 这里有个点,上文说过了,由于默认position的位置是‘top’,                          * 所以这里只需对bottom位置的数据进行处理                         * 最后通过rich给样式设置padding可以实现。							                         */                        const { data, value } = params;                        let arr = data.position == 'bottom' ? ['{bottom|'+ value +'}'] : [value];                        return arr.join('')                    },                    textStyle: {                        rich: {                            bottom: {                                padding: [0, 0, -50, 0]                            },                        }                    }                },                symbol: 'circle',                symbolSize: 8,                lineStyle: {                    width: 1                },                itemStyle: {                    borderWidth: 1,                    borderColor: '#fff',                },                data: []            },            {                name: '上周同期',                type: 'line',                color: '#ffa65e',                label: {                    show: true,                    color: colors[1],                    formatter: (params) => {                        // data 映射的数据源; value 折线图实际取值;                        const { data, value } = params;                        let arr = data.position == 'bottom' ? ['{bottom|'+ value +'}'] : [value]                        return arr.join('')                    },                    textStyle: {                        rich: {                            bottom: {                                padding: [0, 0, -50, 0]                            }                        }                    }                },                symbol: 'circle',                symbolSize: 8,                lineStyle: {                    width: 1                },                itemStyle: {                    borderWidth: 1,                    borderColor: '#fff',                },                data: []            }        ],        dataZoom: {            type:'inside',            orient: 'horizontal',            start: 0,            end: 20,            height: 12,//组件高度            borderColor: "#F4F4F4",            zoomLock: true,        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81

以上基本就可以实现如图的效果了。

还是那句话:

花费了一些时间,抱着分享的心态来分享一下心得,希望不要转载
对你有帮助的话麻烦点个赞或收藏,感激,赠人玫瑰,手有余香🌹

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发