Python 绘制全球疫情地图
国内疫情得到控制后,我就没怎么再关心过疫情,最近看到一条新闻,全球疫情累计确诊人数已经突破 500w 大关,看到这个数字我还是有点吃惊的。
思来想去,还是写一篇全球疫情的分析的文章,本文包括网络爬虫、全球疫情地图绘制等方面。
网络爬虫
我之前有分享过疫情数据的来源,用的是 AKShare 的数据源,好用是真好用,就是网络太慢了, AKShare 的数据很多是来源于 GitHub ,我的网络访问太平洋彼岸的数据还是有点力不从心。
这次我换了新的数据源,来源腾讯新闻的实时数据,站点链接如下:
本来我以为需要解析页面元素,才能获取到数据,但是等我分析了 network 以后发现,竟然可以直接找到数据接口,这大大的方便了我们数据抓取。
获取全球疫情数据接口如下:
https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist
把这个接口放在 PostMan 里面模拟访问一下:
毫无反爬手段,header 神马的都不需要配置,直接访问就能拿到数据,到这里,我们可以开始写爬虫的代码了,最终代码如下:
import requests
from datetime import datetime
def catch_data():
"""
抓取当前实时数据,并返回 国家、大洲、确诊、疑似、死亡、治愈 列表
:return:
"""
url = 'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist'
data = requests.post(url).json()['data']
date_list = list() # 日期
name_list = list() # 国家
continent_list = list() # 大洲
confirm_list = list() # 确诊
suspect_list = list() # 疑似
dead_list = list() # 死亡
heal_list = list() # 治愈
for item in data:
month, day = item['date'].split('.')
date_list.append(datetime.strptime('2020-%s-%s' % (month, day), '%Y-%m-%d'))
name_list.append(item['name'])
continent_list.append(item['continent'])
confirm_list.append(int(item['confirm']))
suspect_list.append(int(item['suspect']))
dead_list.append(int(item['dead']))
heal_list.append(int(item['heal']))
return date_list, name_list, continent_list, confirm_list, suspect_list, dead_list, heal_list
def save_csv():
"""
将数据存入 csv 文件
:return:
"""
date_list, name_list, continent_list, confirm_list, suspect_list, dead_list, heal_list = catch_data()
fw = open('2019-nCoV.csv', 'w', encoding='utf-8')
fw.write('date,name,continent,confirm,suspect,dead,heal\n')
i = 0
while i < len(date_list):
date = str(date_list[i].strftime("%Y-%m-%d"))
fw.write(date + ',' + str(name_list[i]) + ',' + str(continent_list[i]) + ',' + str(confirm_list[i]) + ',' + str(suspect_list[i]) + ',' + str(dead_list[i]) + ',' + str(heal_list[i]) + '\n')
i = i + 1
else:
print("csv 写入完成")
fw.close()
if __name__ == '__main__':
save_csv()
最终得到的 csv 文件是这样的:
全球疫情地图
前端或网站开发的朋友应该都使用过强大的 Echarts 插件。 ECharts 是一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器,底层依赖轻量级的 Canvas 类库 ZRender ,提供直观、生动、可交互、可高度个性化定制的数据可视化图表。 ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的地图、热力图、线图,用于关系数据可视化的关系图、treemap,多维数据可视化的平行坐标,还有用于 BI 的漏斗图、仪表盘,并且支持图与图之间的混搭。
既然 Echarts 如此强大, Python 肯定有相应的第三方扩展包支持,它就是我们接下来绘制世界地图要用到的 PyEcharts 。 PyEcharts 是一个用于生成 Echarts 图表的类库,即 Echarts 与 Python 的对接。
安装语句如下:
pip install pyecharts
PyEcharts 安装完成后我们就可以开始写接下来的代码了,如下:
from pyecharts import options as opts
from pyecharts.charts import Map
import pandas as pd
import namemap
def read_country_code():
"""
获取国家中英文字典
:return:
"""
country_dict = {}
for key, val in namemap.nameMap.items(): # 将 nameMap 列表里面键值互换
country_dict[val] = key
return country_dict
def read_csv():
"""
读取数据,返回国家英文名称列表和累计确诊数列表
:return:
"""
country_dict = read_country_code()
data = pd.read_csv("2019-nCoV.csv", index_col=False)
countrys_names = list()
confirmed_count = list()
for x in range(len(data.index)):
if data['name'].iloc[x] in country_dict.keys():
countrys_names.append(country_dict[data['name'].iloc[x]])
confirmed_count.append(data['confirm'].iloc[x])
else:
print(data['name'].iloc[x])
return countrys_names, confirmed_count
def draw_map():
"""
绘制世界地图
遇到一个很神奇的问题:
两个列表必须写死数据地图才会渲染数据,如果数据是从方法中获得,则地图不渲染数据
:return:
"""
# countrys_names, confirmed_count = read_csv()
# print(countrys_names)
# print(confirmed_count)
countrys_names = ['United States', 'Brazil', 'Russia'...]
confirmed_count = [1666828, 347398, 335882...]
c = (
Map()
.add(
"确诊人数",
[list(z) for z in zip(countrys_names, confirmed_count)],
is_map_symbol_show=False,
maptype="world",
label_opts=opts.LabelOpts(is_show=False),
itemstyle_opts=opts.ItemStyleOpts(color="rgb(49,60,72)")
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title="全球 2019-nCoV 地图"),
visualmap_opts=opts.VisualMapOpts(max_=1700000),
)
.render("map_world.html")
)
if __name__ == '__main__':
draw_map()
最终结果如下:
在绘制全球疫情地图的时候,我们最终使用的国家的名称是英文的,所以需要用到一个中英文国家名称对照字典,这个字典我找到了两个版本,一个是 Python 格式的文件 namemap.py
,还有一个是 json 格式的文件 country-code.json
, 使用这两个文件中的任意一个将我们在前面获取到的数据中的中文国家名称转换为英文。这两个文件我都会提交到代码仓库,有需要的同学可以在公众号里回复关键字获取。
另外,在最后绘制地图的时候遇到了一个很奇葩的问题,国家名称列表和累计确诊人数列表如果是从前面的方法中获取到的,在最后渲染成 map_world.html
的时候,将不会渲染数字,所有的数字都是 null
,但是如果这两个列表 copy 出来,写死在代码中,就可以成功的渲染,有清楚这个问题的朋友可以在留言中解答一下,万分感激。
需要源代码的同学可以在公众号后台回复「全球疫情」获取。
Python 绘制全球疫情地图的更多相关文章
- 用Python绘制全球疫情变化地图
目前全球疫情仍然比较严重,为了能清晰地看到疫情爆发以来至现在全球疫情的变化趋势,我绘制了一张疫情变化地图,完整代码共 230 行,需要的朋友在公众号回复关键字 疫情地图 即可. 废话不多说,先上图 下 ...
- 【疫情动态条形图】用Python开发全球疫情排名动态条形图bar_chart_race
一.开发背景 你好,我是 @马哥python说 ,这是我用Python开发的全球疫情动态条形图,演示效果: https://www.zhihu.com/zvideo/15603276220259696 ...
- 如何用 Python 绘制玫瑰图等常见疫情图
新冠疫情已经持续好几个月了,目前,我国疫情已经基本控制住了,而欧美国家正处于爆发期,我们会看到很多网站都提供了多种疫情统计图,今天我们使用 Python 的 pyecharts 框架来绘制一些比较常见 ...
- Python爬取全球疫情数据,实现可视化显示地图数据(附代码)
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 武汉地区,目前已经实现住院患者清零了,国内疫情已经稳定,然而中国以外新冠确 ...
- python绘制疫情图
python中进行图表绘制的库主要有两个:matplotlib 和 pyecharts, 相比较而言: matplotlib中提供了BaseMap可以用于地图的绘制,但是个人觉得其绘制的地图不太美观, ...
- 带大家用40行python代码实现一个疫情地图
最近两个月,因为新冠病毒无情的肆虐,相信会给每个中国人的记忆中画上重重的一笔.到今天为止,疫情形势依然十分严峻,虽然除湖北外的其他省份已经连续十一天确诊人数下降,但是接下来还有将近至少1.6亿的人口迁 ...
- 【实战】通过Python实现疫情地图可视化
目录 一. json模块 二.通过Python实现疫情地图可视化 2.将json格式的数据保存到Excel 3.应用pyecharts进行数据可视化 一. json模块 JSON(JavaScript ...
- GeoDa绘制疫情地图
刚学习GeoDa,菜鸟,目前还不能在地图上显示省市名称,求教. 看到丁香医生发布的疫情地图,我也尝试做一下,不过我的shp文件上只有中国大陆的31个省市. 数据来源于丁香医生,截至时间为 2020.1 ...
- 用python画出全球疫情趋势变化图
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:谦睿科技 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...
随机推荐
- 常用的CSS小技巧
实际开发过程中会遇到一些需要用CSS小技巧处理的布局问题,现在分享几个个人工作中遇到的小问题和解决方案. 1.inline元素间的空白间隙 这里要介绍一个神器font-size:0. 如果你写了个列表 ...
- Clickhouse 时区转换(下)
Clickhouse 时区转换续—时区参数转换 天天加班,时间不够,主要还是我太懒,流汗,,,,,,另外如果这篇学习笔记超过100阅读量并有评论,我可能半夜也会爬起来更新的. 相信大家看我之前记录的这 ...
- DP 60题 -2 HDU1025 Constructing Roads In JGShining's Kingdom
Problem Description JGShining's kingdom consists of 2n(n is no more than 500,000) small cities which ...
- zabbix分布式安装全过程
项目规划 软件 版本 IP zabbix-server 3.4.15 10.1.10.128 zabbix-proxy 3.4.15 10.1.10.129 zabbix-agent 3.4.15 1 ...
- Java 经典面试题:聊一聊 JUC 下的 CopyOnWriteArrayList
ArrayList 是我们常用的工具类之一,但是在多线程的情况下,ArrayList 作为共享变量时,并不是线程安全的.主要有以下两个原因: 1. ArrayList 自身的 elementData. ...
- 学习vue第七节,filter过滤器如何的使用
vue 过滤器如何的使用 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- C. Jury Marks 思维
C. Jury Marks 这个题目虽然是只有1600,但是还是挺思维的. 有点难想. 应该可以比较快的推出的是这个肯定和前缀和有关, x x+a1 x+a1+a2 x+a1+a2+a3... x+s ...
- SpringBoot:扩展SpringMVC、定制首页、国际化
目录 扩展使用SpringMVC 如何扩展SpringMVC 为何这么做会生效(原理) 全面接管SpringMVC 首页实现 页面国际化 SpringBoot扩展使用SpringMVC.使用模板引擎定 ...
- Golang 实现 Redis(5): 用跳表实现SortedSet
本文是使用 golang 实现 redis 系列的第五篇, 将介绍如何使用跳表实现有序集合(SortedSet)的相关功能. 跳表(skiplist) 是 Redis 中 SortedSet 数据结构 ...
- 前端自适应样式reset.css
@charset "utf-8"; /* CSS Document */ html, body, ul, li, ol, dl, dd, dt, p, h1, h2, h3, h4 ...