ECharts-旭日图(Sunburst)带时间轴

常见结构
var dom = document.getElementById("container");
//定义echarts对象
var myChart = echarts.init(dom);
//构建图表的参数
 var option = {
    //定义标题
    title: {
        text: '揽件汇总',
        textStyle: {
            fontSize: 14,
            align: 'center'
        }
    },
    //鼠标悬停显示,旭日图的{d}百分比 显示不出来
    tooltip: {
        trigger: 'item',
        formatter: "{b}: {c}"
    },
    //参数列表
    series: {
        type: 'sunburst',
        highlightPolicy: 'ancestor',
        //数据源
        data: 数据源,
        radius: [0, '95%'],
        //排序,null表示依据后台传的数据排序
        sort: null,
        levels: [{}, {
            //内环
            r0: '15%',
            r: '40%',
            itemStyle: {
                borderWidth: 2
            },
            label: {
                rotate: 'tangential'
            }
        }, {
            //中环
            r0: '40%',
            r: '69%',
            label: {
                align: 'right'
            }
        }, {
            //外环
            r0: '69%',
            r: '77%',
            label: {
                position: 'outside',
                padding: 3,
                silent: false,
                color:'black'
            },
            itemStyle: {
                borderWidth: 3
            }
        }]
    }
 }

 myChart.setOption(iption);

添加时间轴和加载动画

这里写图片描述
echarts是一次把所有数据都获取到之后才构建图表的,时间轴的每一个节点都是一个旭日图,以前的option{}变为options[{},{}]。\
这时获取的数据就是单一旭日图的好n倍,加载时间必然会加长,需要添加等待动画

image

注意点:
  • 数据结构,与单一旭日图相比,除了需要传每个时间点的数据,还是要传每个时间节点,如果要查询的时间点是固定不变的可不传
    public JSONObject getData(Map<String, Object> map) throws ParseException {
        JSONObject totinfo = new JSONObject();
        //7天数据集合
        List<Object> resAll = new ArrayList<>();
        //7天时间节点
        List<String> daylist = new ArrayList<>();
        //查询第一天时保存最大日期和日期列表
         String  maxDate = effect_echartsDao.getmaxDate();
        Calendar c = Calendar.getInstance();
        Date date = new SimpleDateFormat("yyyy-MM-dd").parse(maxDate);
        c.setTime(date);
        int i=0;
        do {
            daylist.add(maxDate);
            //获取某一天的数据
            List<Echarts_torusVO> areaList = getOneDayinfo(maxDate);
            resAll.add(areaList);
            i++;
            //天数往前推一天
            c.add(Calendar.DATE, -1);
            maxDate = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
        }while (i<7);
        totinfo.put("rows",resAll);
        totinfo.put("daylist",daylist);
        return totinfo;
    }
  • myChart.showLoading();是echarts自带的加载动画,使用前提是ajax使用异步加载,否则页面整个锁住(即便等待gif显示都会卡成静态图)。\
    然而使用异步加载会导致后面构建图表时数据源和时间节点参数还没赋值。\
    所以我使用的定时函数,每0.1秒执行一次,判断ajax执行完没有,如果执行完了,那么我的两个变量不为null,这时就可以开始绘制图表了,否则就一直等待

  • 其他一些小问题

baseOption:{
            timeline: {
                axisType:'category',
                /* autoPlay: true,
                 playInterval:3000,*/
                 //时间节点必须是字符数组,后台的List可以使用data.toString().split(",");转化
                data: daylist
            },
            title: {
                subtext: '大区省分拨规划达成票数统计'
            }
        },
 options:[
            {
                title: {
                    //标题跟随时间切换动态显示
                    text: daylist[0]+'揽件汇总',
                    textStyle: {
                        fontSize: 14,
                        align: 'center'
                    }
                },
                tooltip: {
                    trigger: 'item',
                    formatter: "{b}: {c}"
                },
                series: {
                    type: 'sunburst',
                    highlightPolicy: 'ancestor',
                    data: alldata[0],
                    。。。
                }
            },
            {...},
            {...},
            {...},
            {...}
        ]
优化代码(官方方案)

补上前面的坑,后来有空看了一下官方文档,官网提供的请求数据方式ajax结构简单,又不需要考虑同步异步的问题,简直完美

这里写图片描述

ECharts中,旭日sunburst)是一种特殊的扇形,用于展示层级结构中的据。当你点击旭日的某一部分时,默认会触发旋转动画,展示或隐藏子节点据。如果你希望在点击时只触发事件而不展示具体的据(即不旋转),可以通过自定义事件处理函来实现。 具体操作步骤如下: 1. 为旭日组件绑定点击事件,例如使用`click`事件。 2. 在事件处理函中,使用`event-seriesIndex`和`event-dataIndex`来获取被点击的据项的索引。 3. 使用`setOption`方法来更新ECharts的配置项,但不包含旋转动画的配置。你可以设置一个标志变量来控制是否执行旋转动画。 4. 在事件处理函中,根据需要触发的逻辑(例如弹出详情、跳转等),而不在函中设置扇区的展开或折叠。 以下是一个简单的示例代码: ```javascript // 假设echarts实例化对象为myChart myChart.on('click', function (params) { // 通过params找到点击的扇形对应的索引 var seriesIndex = params.seriesIndex; var dataIndex = params.dataIndex; // 执行事件处理逻辑,这里可以根据实际情况来编写 // ... // 假设你有一个变量来控制是否执行旋转动画 var shouldRotate = false; if (!shouldRotate) { // 不执行旋转动画的逻辑 return; } // 正常情况下,点击后会触发旋转动画展示或隐藏据 // 如果你只是想点击触发事件而不改变显示状态,可以在这里通过setOption来更新表 // 但不包含旋转动画相关的配置,例如不调用setOption来更新扇区的状态 }); ``` 注意,当你决定不执行旋转动画时,应该确保不要调用任何会更新扇区状态的`setOption`方法,这样用户就不会看到据项的展开或折叠。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

占星安啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值