Advertisement

全球疫情可视化实时更新

阅读量:

全球疫情可视化实时更新

1. 配置

boostrap为前端框架,echarts可视化,jQuery获取、处理数据

2. 思路

  1. 前端框架搭好,这里不细说
  2. 后端用JQuery从API中获取数据

3. 如何用echarts做全球疫情地图

以累计确诊病例分布图为例

数据源为https://lab.isaaclin.cn/nCoV/api/area?latest=1

获取数据的框架

复制代码
     $.get("https://lab.isaaclin.cn/nCoV/api/area?latest=1",
      function (data, status) {
      //处理数据
      });

处理Json数据

复制代码
    var arr = [];
            // 处理数据,成地图需要的数据结构
    data.results.forEach(item => {
    // 循环的过程中,向空数组中加入所需的内容
    if(item.countryName==item.provinceName){  
    //这个判断是因为,这个数据还统计了中国省份和城市的数据,所以这个条件用于判断这个元组是否为国家的数据                  
    arr.push({
        name: item.countryEnglishName, // name固定
        value: item.confirmedCount, // value固定
        nowconfirm: item.currentConfirmedCount, // 当前确诊
        heal: item.curedCount,//治愈数
        dead: item.deadCount,//死亡数
        CName:item.countryName//国家的中文名字
    });
    }  
    });

由于echarts世界地图world.js中的标注均为英文名称,在整合丁香园提供的数据时发现可能存在名称对应错误的情况。因此我逐个核对并修正丁香园数据中与echarts地图标注不一致的国家名称,并对尚未覆盖或误配的数据进行了补充说明

复制代码
    //统一替换名称不匹配的问题
    arr.forEach(item => {
    if(item.name=='United States of America'){
    item.name='United States'
    }
    else if(item.name=='The Islamic Republic of Mauritania'){
    item.name='Mauritania'
    }
    else if(item.name=='Kazakstan'){
    item.name='Kazakhstan'
    }
    else if(item.name=='Somali'){
    item.name='Somalia'
    }
    else if(item.name=='Central African Republic'){
    item.name='Central African Rep.'
    }
    else if(item.name=='Papua New Cuinea'){
    item.name='Papua New Guinea'
    }
    else if(item.name=='Burma'){
    item.name='Myanmar'
    }
    else if(item.name=='Kampuchea (Cambodia )'){
    item.name='Cambodia'
    }
    else if(item.name=='Laos'){
    item.name='Lao PDR'
    }
    else if(item.name=='SriLanka'){
    item.name='Sri Lanka'
    }
    else if(item.name=='Kingdom of Bhutan'){
    item.name='Bhutan'
    }
    else if(item.name=='Republic of Serbia'){
    item.name='Serbia'
    }
    else if(item.name=='Bosnia and Herzegovina'){
    item.name='Bosnia and Herz.'
    }
    else if(item.name=='Democratic Republic of the Congo'){
    item.name='Dem. Rep. Congo'
    }
    else if(item.name=='North Macedonia'){
    item.name='Macedonia'
    }
    else if(item.name=='Ivory Coast'){
    item.name='Côte d\'Ivoire'
    }
    else if(item.CName=='赞比亚共和国'){
    item.name='Zambia'
    }
    else if(item.CName=='几内亚比绍'){
    item.name='Guinea-Bissau'
    }
    else if(item.CName=='刚果(布)'){
    
    item.name='Congo'
    }
    else if(item.CName=='厄立特里亚'){
    
    item.name='Eritrea'
    }
    else if(item.CName=='黑山'){
    
    item.name='Montenegro'
    }
    else if(item.CName=='吉尔吉斯斯坦'){
    
    item.name='Kyrgyzstan'
    }
    });

echarts配置三个步骤

  1. 初始化

注意,这里的id要与前端设置的div的id一致,这样才能匹配

复制代码
     var myChart = echarts.init(document.getElementById('confirm'));
  1. 配置
复制代码
    var option = {
    //配置选项
    }
  1. 生成地图

这里的mychart与第一步的mychart相对应

复制代码
     myChart.setOption(option);

Option配置

也分为四大块

标题部分
复制代码
    title: {
    
    textStyle: {
        fontSize: 28
    },
    
    subtext: '数据更新于'+time2,
    subtextStyle: {
        fontSize: 14,
        top: '10px'
    }
    },

没什么特别需要强调的地方吧?我这边采用了日期格式化处理的一个函数,在这个领域里应用广泛哦,并且愿意与大家交流分享这个技巧。不过目前我对它的具体实现还不是很清楚呢。

复制代码
    Date.prototype.Format = function (fmt) { //author: meizz   
        var o = {  
            "M+": this.getMonth() + 1, //月份   
            "d+": this.getDate(), //日   
            "H+": this.getHours(), //小时   
            "m+": this.getMinutes(), //分   
            "s+": this.getSeconds(), //秒   
            "q+": Math.floor((this.getMonth() + 3) / 3), //季度   
            "S": this.getMilliseconds() //毫秒   
        };  
        if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));  
        for (var k in o)  
        if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));  
        return fmt;  
    }  
    var time2 = new Date().Format("yyyy-MM-dd HH:mm:ss"); 
设置地图及数据
复制代码
    series: [
                    
        {
        type: 'map',
        map: 'world', // 指定是世界地图
        data: arr, // 设置地图中的数据
        label: { // 不显示国家的名字了,很丑
            show: false
        },
        showLegendSymbol: false
    },
    ],

参数说明

type: 'map’说明是地图,如果type: 'bar’说明是柱状图

map: ‘world’, // 指定是世界地图,如果map: 'china’说明是中国地图

label show ,显不显示国家名

showLegendSymbol,如果你需要显示多个图例时,在地图上会显示小圆点吗?看起来不美观的话可以选择将其隐藏掉。

鼠标悬浮提示
复制代码
    tooltip: { // 鼠标悬浮提示
                    formatter: function (params) { // 允许我们自定义悬浮提示的内容
                        // return 你需要提示的内容
                        return `国家:${params.data.CName}<br/>
                        累计确诊:${params.data.value}<br/>
                        当前确诊:${params.data.nowconfirm}<br/>
                        治愈:${params.data.heal}<br/>
                        死亡:${params.data.dead}<br/>
                        `;
                    }
                },

此处无需依赖我们的实现。ECharts会默认返回name和value数据作为悬停提示信息。但这种默认设置会在每一行前添加一个圆圈标记,并显得较为不美观。因此建议采用formatter组件来定制悬停提示的具体内容。

在算死亡率的时候,我想显示小数后两位,且显示为百分比的形式

复制代码
    var deadpercent=(params.data.value*100).toFixed(2)+'%';
可视化配置
复制代码
    visualMap:[ {
                    type: 'piecewise',
                    seriesIndex:0,
                    pieces: [
                        { gt: 10000 }, // 大于10000
                        { gt: 5000, lte: 10000 },
                        { gt: 1000, lte: 5000 },
                        { gt: 500, lte: 1000 },  
                        { gt: 100, lte: 500 },  
                        { gt: 10, lte: 100 },   // (200, 300]
                        { gt: 0, lte: 10 },       
                    ],
                    inRange: {
                        color: ['#ffcfc3', '#eda595', '#d27b64', '#d5462a', '#a8352e', '#6a211d', '#562a2a']
                    },
                    left:10,
                    bottom:20,
                    textStyle:{
                        color:'white'
                    }
                }
               ]
            };

参数说明

对于type类型,在'piecewise'的情况下表示定义域划分是一段一段的;若选择continuous,则表示为连续映射。

pieces:用于限定定义的有效范围;特别地,在涉及数值时,默认采用四舍五入的方式省去小数部分

这里我们需要再设置一个参数precision:2,就可以了

inRange设置的映射的颜色

left、bottom设置图例的位置,相对于原来向右移10,向上移20

textStyle图例文字的一些属性设置

效果图

外部链接中的图片无法正常上传

最后阶段,请确保深入研究echarts官网的配置手册https://www.echartsjs.com/zh/option.html#title

是连续映射

请注意,在涉及数值的小数表示时,默认情况下会自动按四舍五入的方式去除小数部分

这里我们需要再设置一个参数precision:2,就可以了

inRange设置的映射的颜色

left、bottom设置图例的位置,相对于原来向右移10,向上移20

textStyle图例文字的一些属性设置

效果图

在这里插入图片描述

最后建议详细阅读官方文档https://www.echartsjs.com/zh/option.html#title [代码链接]

后续会更新其他的可视化图

全部评论 (0)

还没有任何评论哟~