[ECHARTS]自定義日曆座標系的參數配置信息問題總結

官網例子: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裏面數據即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章