2020 年初始至今,冠状病毒肆虐,好在国内疫情已经逐步减少,武汉也解封了,而国外疫情却日益严重,不容乐观。
做个可视化地图模拟展示一下疫情
我们可以看到,各大 APP 都有实时显示全国乃至世界的疫情数据的地图表,那么它们是如何实现的呢?
让我们以中国为例,实现一下展示效果。由于平时用 Vue 较多,可视化框架之前在项目中用过 echarts,就用这两个来演示。(注:本次数据都是随机生成,非官方真实数据)
用 vue-cli 快速搭建
1 | vue create vue-echarts-map-china |
引入 echarts
1 | yarn add echarts -D |
如何展示中国各省数据
ProvinceChart.vue
1 | <template> |
我们首先需要给 echarts 一个容器
引用 js/json 地图数据
echats 内置了 china.js 和 china.json 及其省市地图包,china.js 引入即可使用 china.json 需要注册到 echarts,两种方式任选
1 | import echarts from "echarts"; |
主要结构
1 | export default { |
drawChinaMap 方法详解
首先找到我们的容器用 echarts.init() 初始化 echarts
1 | this.chart = echarts.init(document.querySelector(".chart"), "macarons"); |
通过 setOption 传入我们需要设定的选项参数
图表类型及参数
最主要的是设置图表类型了
1 | series: [ |
最重要的是 34 个省份的数据,这里我们模拟一下(注意格式和 name 是固定的)
1 | data: [ |
其他选项设置
1 | backgroundColor: "#FFFFFF", |
效果如下:
如何展示中国各市数据
如果要展示各市单独数据较为简单,只需要把地图和对应数据变成省即可
1 | import hubei from "echarts/map/json/province/hubei"; |
你还可以做到点击省切换成市的效果,网上也有相应教程,实现方法也简单,这里不作详细介绍。
但是我想要看整个中国地图下的市的疫情情况怎么办?
合并省市地图
由于官方只提供了中国地图和省市分开的地图 json 或 js 包,而没有合并在一起的,我们没有现成的数据。
然而我注意到,china 和各省的 json 包只是 features 不同,如下图所示:
1 | china.features = [...new Set([...china.features, ...hubei.features])]; |
最终,这种方法被我放弃了,原因如下:
- 视觉效果差:
如下图,有字根本看不清,没字也会很密集
- 渲染效果差:
目前只实现了一个省,可预见的是加上所有省份数据量很大(features 长度最终会是 533 ),渲染会卡顿
- 有引入延迟问题:
由于需要将 34 个省 JSON 包分别引入后合并到 china 内部,通常 echarts 组件已经渲染完毕
使用中国地图配合市散点图
我找到官方提供的scatter-visualMap-piecewise示例,感觉这种方式也能满足我的要求,且呈现效果更好
选项变化
与原选项主要区别是 series 使用 scatter 散点类型,同时引入 geo 地理坐标系组件
1 | geo: { |
其数据格式如下
1 | // this.cityData |
示例小问题
需要注意的是,官方示例中 tooltip 的悬浮数据是有问题的,它不是 pm2.5 的 value,而是极坐标的 Y 的值
想要其展示正确的数据需要在 tooltip 设置 formatter:以回调函数格式设置数据为 data 的第三个数据
1 | tooltip: { |
最终效果如下:
总结
至此,我们完成了国内各省市疫情模拟数据的可视化,如果想要展示世界数据也是类似,只需找到相应地图包替换,并处理对应数据即可。echarts 提供了完整的文档,按需查找对应选项即可完成相应需求,当然还有很多不错的库和方法等我们去探究。
如需查看完整代码:请点这里
看到这里了,不点个赞吗 😄!