[ECHARTS]自定义日历坐标系的参数配置信息问题总结

2 篇文章 0 订阅

官网例子:https://www.echartsjs.com/examples/zh/editor.html?c=custom-calendar-icon

 

首先感谢jsper的指导,顺便吐槽一下官方例子,多写一行注释对于新手来讲应该友好很多

 

问题预览

1.如何按照官网例子拼装数据?

2.异步加载数据无法渲染到日历中?

3.如何替换渲染的自定义图形形状?

 

Q1 如何按照官网例子拼装DATA

1.在浏览器控制台中预览data的数据

只需要仿照数据格式就可以不用重写渲染方式,减少工作量

首先来看官方例子数据在控制台打印出的样子,如下图所示,data是一个二维数据,主要包含了日期和第二个暂时不知道什么的东西(第三个“公告-22011”是我自己乱加的,非官网原有)。通过观察发现日期数据包含整个年度的日期

以下是官方例子中生成data的js函数,结合上述data数据可以发现items是根据paths列表的长度随机生成的整数

//代码片段
function getVirtulData(year) {
    year = year || '2017';
    var date = +echarts.number.parseDate(year + '-01-01');
    var end = +echarts.number.parseDate((+year + 1) + '-01-01');
    var dayTime = 3600 * 24 * 1000;
    var data = [];
    for (var time = date; time < end; time += dayTime) {
        var items = [];
        var eventCount = Math.round(Math.random() * pathes.length);
        for (var i = 0; i < eventCount; i++) {
            items.push(Math.round(Math.random() * (pathes.length - 1)));
        }
        data.push([
            echarts.format.formatTime('yyyy-MM-dd', time),
            items.join('|')
        ]);
    }
    return data;
}

结合日历单元格的tooltip的值,如02的值为2017/03/02 00:00:00,2|1|2|2,依次显示了火箭、桃心、火箭、火箭,可以观察到第二个值实际上是显示图形,2就是火箭,1就是桃心。结合渲染代码来看,确实是这样的规则。

function renderItem(params, api) {
    var cellPoint = api.coord(api.value(0));
    var cellWidth = params.coordSys.cellWidth;
    var cellHeight = params.coordSys.cellHeight;

    var value = api.value(1);
    var events = value && value.split('|');

    if (isNaN(cellPoint[0]) || isNaN(cellPoint[1])) {
        return;
    }

    var group = {
        type: 'group',
        children: echarts.util.map(layouts[events.length - 1], function (itemLayout, index) {
            return {
                type: 'path',
                shape: {
                    pathData: pathes[events[index]],
                    x: -8,
                    y: -8,
                    width: 16,
                    height: 16
                },
                position: [
                    cellPoint[0] + echarts.number.linearMap(itemLayout[0], [-0.5, 0.5], [-cellWidth / 2, cellWidth / 2]),
                    cellPoint[1] + echarts.number.linearMap(itemLayout[1], [-0.5, 0.5], [-cellHeight / 2 + 20, cellHeight / 2])
                ],
                style: api.style({
                    fill: colors[events[index]]
                })
            };
        }) || []
    };

    group.children.push({
        type: 'text',
        style: {
            x: cellPoint[0],
            y: cellPoint[1] - cellHeight / 2 + 15,
            text: echarts.format.formatTime('dd', api.value(0)),
            fill: '#777',
            textFont: api.font({fontSize: 14})
        }
    });

    return group;
}

好了,现在的问题是如何拼接成类似的数据,可以选在在后端生成,也可以选择在前端生成。取决于自己觉得哪种方式更简单。我这里主要是用python后端生成,前端js做简单的处理

 

python后端代码

大致思路,先将所有包含相关日期的数据跑出来,拼接成字典,再生成一个全年日期的列表,遍历判定是否在已有字典中存在,不存在则添加空值,重点说明一下,上面提到图形形状我先使用“ABCD”/“abcd”表示(有值用大写,无值用小写),如“2|1|2|2”表示为“ABcd”,代码如下所示

@login_required
@wechat.route('/api/calendar/data')
def calendarData():
    return_dict = {'return_code': '200', 'return_info': '', 'result_begin': True}
    if request.args is None:
        return_dict['return_code'] = '50004'
        return_dict['return_info'] = '传入参数为空'
        return json.dumps(return_dict, ensure_ascii=False)  # ensure_ascii=False才能输出中文
    get_data = request.args.to_dict()
    year = get_data.get('year')
    month = get_data.get('month').zfill(2)
    year_month = '{0}-{1}'.format(year, month)
    print(year_month)
    # 查询公告日期
    result_begin = LAND_SELL_INFO.query.join(DICT_REGION,
                                             LAND_SELL_INFO.REGION_CODE == DICT_REGION.REGION_CODE).with_entities(
        LAND_SELL_INFO.DATE_BEGIN,
        LAND_SELL_INFO.DATE_END,
        DICT_REGION.REGION_NAME,
        DICT_REGION.TYPE,
        LAND_SELL_INFO.NOTICE_NUM).filter(
        LAND_SELL_INFO.DATE_BEGIN.like("%" + year_month + "%")).all()
    land_info_dict = {}
    for i in result_begin:
        detail_dict_begin = {}
        if i.DATE_BEGIN in land_info_dict:
            tag_value = land_info_dict[i.DATE_BEGIN]["tag"]
        else:
            tag_value = 'abcd'

        # 四位标识码,依次表示主城区公告、主城区成交、区县公告、区县成交
        if i.TYPE == '1':
            detail_dict_begin['tag'] = tag_value.replace('a', 'A')
        else:
            detail_dict_begin['tag'] = tag_value.replace('c', 'C')

        land_info_dict[i.DATE_BEGIN] = detail_dict_begin

    # 查询成交日期
    result_end  = LAND_SELL_INFO.query.join(DICT_REGION,
                                                          LAND_SELL_INFO.REGION_CODE == DICT_REGION.REGION_CODE).with_entities(
        LAND_SELL_INFO.DATE_BEGIN,
        LAND_SELL_INFO.DATE_END,
        DICT_REGION.REGION_NAME,
        DICT_REGION.TYPE,
        LAND_SELL_INFO.NOTICE_NUM).filter(
        LAND_SELL_INFO.DATE_END.like("%" + year_month + "%")).all()
    for i in result_end:
        detail_dict_end = {}
        if i.DATE_END in land_info_dict:
            tag_value = land_info_dict[i.DATE_END]["tag"]
        else:
            tag_value = 'abcd'

        # 四位标识码,依次表示主城区公告、主城区成交、区县公告、区县成交
        if i.TYPE == '1':
            detail_dict_end['tag'] = tag_value.replace('b', 'B')
        else:
            detail_dict_end['tag'] = tag_value.replace('d', 'D')

        land_info_dict[i.DATE_END] = detail_dict_end

    all_day_list=allDay(year)
    for i in all_day_list:
        if i not in land_info_dict:
            land_info_dict[i] = {'tag':'abcd'}
    print(land_info_dict)
    temp_land_info_dict=sorted(land_info_dict.items(), key=lambda x: x[0])
    final_land_info_dict = {}
    for i in temp_land_info_dict:
        print(i)
        final_land_info_dict[i[0]]=i[1]

    return_dict['return_info'] = final_land_info_dict

    return json.dumps(return_dict, ensure_ascii=False)

给前端的数据长这个样子 

前端请求加适当处理

把abcd按标准替换出来,改造后的代码如下所示

function getVirtulData(year) {
                            //异步加载data数据
                            var data_ajax = new Array();
                            $.ajax({
                                type: "GET",
                                async: false,
                                url: "{{ url_for('wechat.calendarData') }}",
                                data: {
                                    year: custom_year,
                                    month: custom_month
                                },
                                dataType: "json",
                                success:
                                    function (data) {
                                        var return_info = data["return_info"]
                                        for (var key in return_info) {
                                            var tag = return_info[key]["tag"]
                                            //按标准替换
                                            tag = tag.replace('A', '0')
                                            tag = tag.replace('B', '1')
                                            tag = tag.replace('C', '2')
                                            tag = tag.replace('D', '3')
                                            tag = tag.replace(/[^0-9]/ig, "")
                                            var tag_split = tag.split('')
                                            data_ajax.push([
                                                key,
                                                tag_split.join('|'),
                                                'goon广告'
                                            ])
                                        }
                                    }
                            });

                            //源代码
                            console.log(data_ajax)
                            data = data_ajax
                            return data;

                        }

Q2 异步加载数据无法渲染到日历中

官方例子打印的data数据

我请求的数据,先显示一个空数组,但是点展开按钮也有数据

 

所以问题来了,我们是同样的拼装方法,为什么在控制台显示差异这么大,而且我请求的数据无法渲染出日期和图形

这里有个很蒙人的事情,实际上我自己请求的数据一开始就是个空数组,只是异步请求回来的数据再加载进去了,导致不熟悉js原理的人以为并没有区别

解决方案

ajax异步中设置成同步请求,添加参数为async: false就有东西了

Q3 如何替换渲染的自定义图形形状

我们知道pathes分别对应的四个形状,雨伞,桃心,火箭和礼物,但是一串看不懂的编码对于我们来说就是一串神秘代码,不知所云。

var pathes = [
    'M936.857805 523.431322c0 0-42.065715-68.89513-88.786739-68.89513-46.68416 0-95.732122 71.223091-95.732122 71.223091s-44.28544-72.503296-93.440922-71.152538c-35.565466 0.977306-62.89705 30.882406-79.124275 64.06615L579.773747 790.800797c-3.253248 37.391565-5.677568 50.904371-12.002816 69.63497-6.651802 19.698688-19.544883 35.227341-31.650099 45.909606-14.30231 12.621414-29.59831 22.066586-45.854208 27.424563-16.28969 5.362074-30.098739 6.496973-51.536794 6.496973-19.498906 0-36.95104-2.963456-52.395418-8.850534-15.410586-5.887078-28.420403-14.313984-39.034573-25.246003-10.613146-10.930995-18.757939-24.08151-24.435507-39.525171-5.676544-15.443763-8.532685-40.195482-8.532685-59.270963l0-26.232454 74.435273 0c0 24.644301-0.17705 64.452915 8.81408 77.006848 9.02697 12.515021 22.756147 18.092032 41.148826 18.791014 16.728678 0.636518 30.032179-8.061645 30.032179-8.061645s11.922022-10.5472 14.992077-19.756954c2.674995-8.025805 3.565363-22.180147 3.565363-22.180147s2.080461-21.789286 2.080461-34.234675L489.399906 514.299369c-16.678502-18.827776-43.801395-61.938688-82.756096-60.927693-54.699008 1.419366-100.422144 70.059622-100.422144 70.059622s-56.065126-70.059622-93.440922-70.059622c-37.376717 0-91.077939 70.059622-91.077939 70.059622S105.343488 156.737741 476.742042 119.363584l53.70327-74.714624 51.373056 74.714624C964.889395 142.740992 936.857805 523.431322 936.857805 523.431322z',
    'M533.504 268.288q33.792-41.984 71.68-75.776 32.768-27.648 74.24-50.176t86.528-19.456q63.488 5.12 105.984 30.208t67.584 63.488 34.304 87.04 6.144 99.84-17.92 97.792-36.864 87.04-48.64 74.752-53.248 61.952q-40.96 41.984-85.504 78.336t-84.992 62.464-73.728 41.472-51.712 15.36q-20.48 1.024-52.224-14.336t-69.632-41.472-79.872-61.952-82.944-75.776q-26.624-25.6-57.344-59.392t-57.856-74.24-46.592-87.552-21.504-100.352 11.264-99.84 39.936-83.456 65.536-61.952 88.064-35.328q24.576-5.12 49.152-1.536t48.128 12.288 45.056 22.016 40.96 27.648q45.056 33.792 86.016 80.896z',
    'M741.06368 733.310464c8.075264-29.262438 20.615373-40.632422 14.64105-162.810061C966.089728 361.789952 967.93897 72.37847 967.855002 54.693683c0.279347-0.279347 0.418509-0.419533 0.418509-0.419533s-0.17705-0.00512-0.428749-0.00512c0-0.251699 0-0.428749 0-0.428749s-0.139162 0.14633-0.418509 0.425677c-17.695744-0.083866-307.10784 1.760051-515.833958 212.142592-122.181632-5.984256-133.55305 6.563533-162.815693 14.644531C235.35063 295.798886 103.552614 436.975309 90.630758 486.076621c-12.921856 49.105408 39.634227 56.859034 58.579558 58.581197 18.953421 1.724314 121.471386-9.475789 130.09111 4.309094 0 0 16.367411 11.200102 17.226035 41.346662 0.850432 29.796659 15.173222 71.354163 37.123994 97.267302-0.028672 0.027648-0.05632 0.054272-0.083866 0.074752 0.158618 0.13097 0.316211 0.261939 0.474829 0.390861 0.129946 0.149402 0.261939 0.319283 0.393011 0.468685 0.019456-0.019456 0.04608-0.049152 0.075776-0.075674 25.918362 21.961216 67.477504 36.272128 97.269248 37.122458 30.149837 0.859546 41.354547 17.234534 41.354547 17.234534 13.779354 8.608051 2.583962 111.122842 4.302131 130.075546 1.727386 18.95168 9.477222 71.498445 58.579558 58.576077C585.12896 918.526771 726.311117 786.734182 741.06368 733.310464zM595.893555 426.206003c-39.961702-39.965184-39.961702-104.75991 0-144.720077 39.970918-39.96928 104.768307-39.96928 144.730112 0 39.970918 39.960064 39.970918 104.75479 0 144.720077C700.661862 466.171187 635.864474 466.171187 595.893555 426.206003zM358.53312 769.516032c-31.923302-4.573184-54.890394-18.410291-71.41847-35.402342-16.984474-16.526438-30.830387-39.495475-35.405824-71.420621-4.649062-28.082586-20.856832-41.167565-38.76649-38.763827-17.906586 2.40681-77.046886 66.714419-80.857805 89.475891-3.80887 22.752154 29.271859 12.081152 46.424166 27.654861 17.151283 15.590093-2.139853 61.93664-14.733107 86.845952-6.441984 12.735078-10.289766 26.42176-4.22953 33.76087 7.346586 6.070272 21.03593 2.222592 33.769472-4.220109 24.912384-12.585677 71.258829-31.872922 86.842368-14.731469 15.583539 17.160806 4.911002 50.229965 27.674419 46.419251 22.754099-3.807744 87.065395-62.946611 89.466163-80.85248C399.70857 790.374093 386.627072 774.166938 358.53312 769.516032z',
    'M848.794624 939.156685 571.780416 939.156685 571.780416 653.17123l341.897539 0 0 221.100654C913.677926 909.960704 884.482867 939.156685 848.794624 939.156685zM571.780403 318.743552c-11.861606-3.210138-31.443354-8.36864-39.829709-16.176435-0.596582-0.561766-1.016218-1.246413-1.613824-1.841971-0.560845 0.596582-1.016218 1.280205-1.613824 1.841971-8.386355 7.807795-15.96631 12.965274-27.827917 16.176435l0 263.544325L141.030675 582.287877 141.030675 355.202884c0-35.687834 29.195059-64.882688 64.883302-64.882688l150.649125 0c-16.984474-9.525965-32.846438-20.56233-46.111027-32.932045-60.250624-56.144691-71.129907-137.062605-24.283034-180.767027 19.615539-18.264986 46.252237-27.124736 75.026739-27.124736 39.933133 0 83.972915 17.070797 118.995968 49.706086 20.353331 18.983322 37.722624 43.405619 50.145075 69.056819 12.457267-25.6512 29.791744-50.074419 50.180915-69.056819 35.022029-32.63529 79.062835-49.706086 118.994944-49.706086 28.74071 0 55.410176 8.860774 75.025715 27.124736 46.882611 43.704422 35.96759 124.622336-24.283034 180.767027-13.264589 12.368691-29.127578 23.40608-46.111027 32.932045l144.649234 0c35.688243 0 64.882278 29.195981 64.882278 64.882688l0 227.084948L571.780416 582.287833 571.780416 318.743508zM435.064218 147.625267c-21.476966-19.965747-49.094144-31.913882-73.868288-31.913882-7.404954 0-21.125018 1.211597-29.863322 9.386803-2.000691 1.824563-8.070144 7.439462-8.070144 21.369754 0 15.650406 8.492749 40.24873 32.319386 62.477926 29.124506 27.12576 77.202432 47.601152 111.76704 47.601152 12.176794 0 16.492237-2.666701 16.527053-2.702541C489.524736 242.54505 475.664486 185.453773 435.064218 147.625267zM577.78135 254.790963c0 0 0.034816-0.034816 0.069632-0.034816 0.807424 0 5.50871 1.790771 15.509914 1.790771 34.564608 0 82.64151-20.47529 111.76704-47.601152 23.826637-22.229299 32.283546-46.810112 32.283546-62.442189 0-13.930291-6.033613-19.562496-8.035328-21.404467-8.77312-8.17623-22.457344-9.386803-29.864346-9.386803-24.808038 0-52.390298 11.948134-73.867264 31.913882C585.325466 185.208218 571.358822 241.73865 577.78135 254.790963zM500.89513 939.156685 205.914017 939.156685c-35.688243 0-64.883302-29.195981-64.883302-64.883712L141.030714 653.17123l359.864462 0L500.895177 939.15666z'
];

实际上这是svg图形。可以参考菜鸟教程的svg编辑器https://c.runoob.com/more/svgeditor/自己画,然后复制进去替换掉

基本操作就是画完了点击工具栏视图-源代码,如下图所示,在源代码中能查看到那串神秘代码了

 把圈出来的复制出来,替换pathes里面数据即可。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值