日期:2025/04/06 02:02来源:未知 人气:60
近期,新冠病毒又开始新一轮的肆虐,国内出现了一些省份大范围的感染病例。新出现的奥密克戎变异株BA.2.38平均潜伏期短,传播力和隐匿性强、传播速度快,感染剂量低,具有很强的免疫逃逸能力。小伙伴们要注意自我防护哦!
做好自我防护
今天,我们不讨论新冠病毒。居家之余,我们看下如何用Python中的pyechart模块进行地理数据可视化。在此基础上制作2个案例,别走开,源代码及相关数据文末奉上!
世界人口排名地图
世界人口排名地图
世界疫情最新确诊数据展示(数据仅供参考)
世界疫情地图
下面,我们开始介绍。
一、pyechart介绍
是一个百度开源的数据可视化工具,它借助Python丰富的“表达能力”及数据处理方面的独特优势,凭借自身良好的交互性及漂亮的图表设计,得到了众多开发者的认可。简单来讲,pyechart就是将Python处理的数据进行可视化展示的一种工具(Python中叫模块或库)。
数据可视化
【特点】
我们知道,Python中的数据可视化工具有很多,比如,常见的matplotlib、Seaborn、ggplot、pygal等。那么,pyechart对比这些库,它有哪些特点呢?下面,是这个模块官网的特点总结:
简洁的 API 设计,使用如丝滑般流畅,支持链式调用囊括了 30+ 种常见图表,应有尽有支持主流 Notebook 环境,Jupyter Notebook 和 JupyterLab可轻松集成至 Flask,Django 等主流 Web 框架高度灵活的配置项,可轻松搭配出精美的图表详细的文档和示例,帮助开发者更快的上手项目多达 400+ 地图文件以及原生的百度地图,为地理数据可视化提供强有力的支持重点了解下最后这个特点,我们知道,百度对于地图方面的应用技术应该是比较成熟的,那它开源的这个pyechart库应该也不错,下面我们试试看。开始之前,需要安装这个模块。
需要安装
【安装】
pyecharts 分为 v0.5.X 和 v1 两个大版本。其中,两大版本之间不兼容(很像Python 2.X 和 Python 3.X),v1 是一个全新的版本。目前,最新版的v1是1.9.1版本。
使用 pip install pyechart来安装。一般不会出现什么错误(至少我没遇到过^-^)。
当然,如果你使用的是PyCharm,可以在图形界面下完成安装,下面界面提示安装成功。
PyCharm界面下安装
安装成功了,我们看下如何使用这个模块创建一个世界地图。
创建世界地图的通用方法(展示)
一般按下面步骤展示数据。
人口普查数据
【第一步:准备数据】
没有数据,我们展示什么呢?这是数据类展示应用首先应该考虑的问题。我们这里展示全世界人口排名前40的国家人口数量(我们事先从网上获取到相关数据,并保存为“populationtop20”,别着急,这个文件后面有下载方式)。使用xlrd把数据读取出来。
人口数据(top40)
导入模块
import xlrd
wb = xlrd.open_workbook('populationtop20.xls')
ws = wb.sheet_by_name('pdata')
国家名称数据
contryNames = [i.value for i in ws.col(1)]
人口数据
contryPDatas = [i.value for i in ws.col(3)]
contryNames、contryPDatas这两个数据备用。
【第二步:创建地图实例并设置相关属性】
跟使用任何第三库一样,首先,需要导入模块,一般情况下这样导入。import xlrd
from pyecharts import options as opts
from pyecharts.charts import Map
第一行导入了我们处理数据需要的工具,当然,这里小伙伴可以导入自己熟悉的库,比如pandas、openpyxl、csv等,这需要根据数据格式确定第二行导入的这个options是数据可视化模块pyecharts的全局配置选项,对于图表大小、标题、主题、背景颜色、动画等设置,通常这个模块进行设置第三行中导入了我们的Map类,这个类就是绘制地图的类(稍后详细介绍)。创建地图实例并设置相关属性创建地图源代码如下,这里直接在创建过程中对属性进行了设置。
创建实例源代码
这里设置的options的属性有哪些呢?
options可选设置项
小伙伴可以自己试试看,上面案例实现效果如下图(文末附源代码)。
世界人口排名地图
我们重点介绍一下Map类的属性。Map类的源代码很简单,如下:
class Map(Chart, MapMixin):pass它继承自类Chart、MapMixin,兼具这两个父类的属性。具体有哪些属性,这里不再赘述,后面我们专题介绍。
【第三步:保存渲染结果】
c.render("世界人口数据2022年排名TOP40.html") 默认保存为一个render.html的文件,此处自定义文件名称。
就这样简单的三个步骤。
下面,我们来看一个比较复杂的案例,完成全世界疫情数据的统计。
疫情数据统计
地图展示全世界各个国家最新确诊病例
按照上面的流程,第一步应该是准备数据。这里我们通过新浪最新疫情数据API接口爬取了最新各国疫情数据,并保存为Excel文件(这里我们直接使用)。具体方法就不介绍了,下面专栏会有所涉及。
具体表格结构如下:
全球疫情数据
这个案例主要的问题不是如何绘图,其实是数据一致化处理。说白了,就是将中文国家转化为英文的国家名,且英文名称需要和pyechart中国家名称一致。否则,地图数据不会正常显示^-^
【数据一致化处理】
全球各个国家名称字典
这里有一个国家英文对应表
name_map = {'Singapore Rep.': '新加坡', 'Dominican Rep.': '多米尼加', 'Palestine': '巴勒斯坦', 'Bahamas': '巴哈马', 'Timor-Leste': '东帝汶', 'Afghanistan': '阿富汗', 'Guinea-Bissau': '几内亚比绍', "Cte d'Ivoire": '科特迪瓦', 'Siachen Glacier': '锡亚琴冰川', "Br. Indian Ocean Ter.": '英属印度洋领土', 'Angola': '安哥拉', 'Albania': '阿尔巴尼亚', 'United Arab Emirates': '阿联酋', 'Argentina': '阿根廷', 'Armenia': '亚美尼亚', 'French Southern and Antarctic Lands': '法属南半球和南极领地', 'Australia': '澳大利亚', 'Austria': '奥地利', 'Azerbaijan': '阿塞拜疆', 'Burundi': '布隆迪', 'Belgium': '比利时', 'Benin': '贝宁', 'Burkina Faso': '布基纳法索', 'Bangladesh': '孟加拉国', 'Bulgaria': '保加利亚', 'The Bahamas': '巴哈马', 'Bosnia and Herz.': '波斯尼亚和黑塞哥维那', 'Belarus': '白俄罗斯', 'Belize': '伯利兹', 'Bermuda': '百慕大', 'Bolivia': '玻利维亚', 'Brazil': '巴西', 'Brunei': '文莱', 'Bhutan': '不丹', 'Botswana': '博茨瓦纳', 'Central African Rep.': '中非', 'Canada': '加拿大', 'Switzerland': '瑞士', 'Chile': '智利', 'China': '中国', 'Ivory Coast': '象牙海岸', 'Cameroon': '喀麦隆', 'Dem. Rep. Congo': '刚果民主共和国', 'Congo': '刚果', 'Colombia': '哥伦比亚', 'Costa Rica': '哥斯达黎加', 'Cuba': '古巴', 'N. Cyprus': '北塞浦路斯', 'Cyprus': '塞浦路斯', 'Czech Rep.': '捷克', 'Germany': '德国', 'Djibouti': '吉布提', 'Denmark': '丹麦', 'Algeria': '阿尔及利亚', 'Ecuador': '厄瓜多尔', 'Egypt': '埃及', 'Eritrea': '厄立特里亚', 'Spain': '西班牙', 'Estonia': '爱沙尼亚', 'Ethiopia': '埃塞俄比亚', 'Finland': '芬兰', 'Fiji': '斐', 'Falkland Islands': '福克兰群岛', 'France': '法国', 'Gabon': '加蓬', 'United Kingdom': '英国', 'Georgia': '格鲁吉亚', 'Ghana': '加纳', 'Guinea': '几内亚', 'Gambia': '冈比亚', 'Guinea Bissau': '几内亚比绍', 'Eq. Guinea': '赤道几内亚', 'Greece': '希腊', 'Greenland': '格陵兰', 'Guatemala': '危地马拉', 'French Guiana': '法属圭亚那', 'Guyana': '圭亚那', 'Honduras': '洪都拉斯', 'Croatia': '克罗地亚', 'Haiti': '海地', 'Hungary': '匈牙利', 'Indonesia': '印度尼西亚', 'India': '印度', 'Ireland': '爱尔兰', 'Iran': '伊朗', 'Iraq': '伊拉克', 'Iceland': '冰岛', 'Israel': '以色列', 'Italy': '意大利', 'Jamaica': '牙买加', 'Jordan': '约旦', 'Japan': '日本', 'Kazakhstan': '哈萨克斯坦', 'Kenya': '肯尼亚', 'Kyrgyzstan': '吉尔吉斯斯坦', 'Cambodia': '柬埔寨', 'Korea': '韩国', 'Kosovo': '科索沃', 'Kuwait': '科威特', 'Lao PDR': '老挝', 'Lebanon': '黎巴嫩', 'Liberia': '利比里亚', 'Libya': '利比亚', 'Sri Lanka': '斯里兰卡', 'Lesotho': '莱索托', 'Lithuania': '立陶宛', 'Luxembourg': '卢森堡', 'Latvia': '拉脱维亚', 'Morocco': '摩洛哥', 'Moldova': '摩尔多瓦', 'Madagascar': '马达加斯加', 'Mexico': '墨西哥', 'Macedonia': '马其顿', 'Mali': '马里', 'Myanmar': '缅甸', 'Montenegro': '黑山', 'Mongolia': '蒙古', 'Mozambique': '莫桑比克', 'Mauritania': '毛里塔尼亚', 'Malawi': '马拉维', 'Malaysia': '马来西亚', 'Namibia': '纳米比亚', 'New Caledonia': '新喀里多尼亚', 'Niger': '尼日尔', 'Nigeria': '尼日利亚', 'Nicaragua': '尼加拉瓜', 'Netherlands': '荷兰', 'Norway': '挪威', 'Nepal': '尼泊尔', 'New Zealand': '新西兰', 'Oman': '阿曼', 'Pakistan': '巴基斯坦', 'Panama': '巴拿马', 'Peru': '秘鲁', 'Philippines': '菲律宾', 'Papua New Guinea': '巴布亚新几内亚', 'Poland': '波兰', 'Puerto Rico': '波多黎各', 'Dem. Rep. Korea': '朝鲜', 'Portugal': '葡萄牙', 'Paraguay': '巴拉圭', 'Qatar': '卡塔尔', 'Romania': '罗马尼亚', 'Russia': '俄罗斯', 'Rwanda': '卢旺达', 'W. Sahara': '西撒哈拉', 'Saudi Arabia': '沙特阿拉伯', 'Sudan': '苏丹', 'S. Sudan': '南苏丹', 'Senegal': '塞内加尔', 'Solomon Is.': '所罗门群岛', 'Sierra Leone': '塞拉利昂', 'El Salvador': '萨尔瓦多', 'Somaliland': '索马里兰', 'Somalia': '索马里', 'Serbia': '塞尔维亚', 'Suriname': '苏里南', 'Slovakia': '斯洛伐克', 'Slovenia': '斯洛文尼亚', 'Sweden': '瑞典', 'Swaziland': '斯威士兰', 'Syria': '叙利亚', 'Chad': '乍得', 'Togo': '多哥', 'Thailand': '泰国', 'Tajikistan': '塔吉克斯坦', 'Turkmenistan': '土库曼斯坦', 'East Timor': '东帝汶', 'Trinidad and Tobago': '特里尼达和多巴哥', 'Tunisia': '突尼斯', 'Turkey': '土耳其', 'Tanzania': '坦桑尼亚', 'Uganda': '乌干达', 'Ukraine': '乌克兰', 'Uruguay': '乌拉圭', 'United States': '美国', 'Uzbekistan': '乌兹别克斯坦', 'Venezuela': '委内瑞拉', 'Vietnam': '越南', 'Vanuatu': '瓦努阿图', 'West Bank': '西岸', 'Yemen': '也门', 'South Africa': '南非', 'Zambia': '赞比亚', 'Zimbabwe': '津巴布韦', 'Comoros': '科摩罗'}大家直接复制可用。我们直接
案例中有几个特殊情况需要处理
细心的小伙伴可能发现了,上面字典中,我的数据刚好是反的,需要进行处理(这个可以练练手)。
还有需要注意的是,我们知道根据字典的键,获取字典值很容易,那么,如何根据字典的值获取键呢?(想想本文是不是需要这样处理?)
def getkey(value, tDict):'''知道值获取键'''keys = [i for i in tDict.keys()]values = [j for j in tDict.values()]if value in values:i = values.index(value)return keys[i]如果返回值为None,则表示字典中没有这个值。
另外,部分字典中国家中文名称和Excel中国家名称不对应,需要修改。否则,这几个国家数值不能正常显示(源代码中已修改)。如:波黑(Excel文件中为全称)、蒙古(Excel文件中为蒙古国)、土库曼斯坦(Excel文件中没有,我们最后一行添加数据0)、刚果民主共和国(Excel文件中为刚果(金))、刚果(Excel文件中为刚果(布))。
这样,我们判断Excel表格中国家列表是否在name_map字典中,如果存在则绘制;如果不存在则跳转到下一条记录。
世界疫情地图
其它属性可参照百度学习,这里就不再赘述了。需要说明的是,我们这里统计了Excel表中的2项目内容,其它数据都可以添加进去。为了便于理解,我把两个列表数据分开来写了,这里应该有改进方式,留给小伙伴自己思考解决。
一些总结
下面是用pyechart绘制地图的一些心得:
pyechart中有Geo、Map、和Bmap地图三种, 本案例使用的Map地图(后续介绍其它类的使用方法)国家名称需要转换成英文, 且英文名称需要和pyechart中国家名称一致(上文中字典可复制,实际使用时调换键值对即可,这里给小伙伴出了道难题)这类应用一般通过国家(世界地图)、省市县(全国地图)名称与数据关联,数据格式为列表列表格式: [[国家(省市县), 值],[国家(省市县), 值]....]
一般使用Map实例.add()添加地图,参数maptype="world"使用世界地图,参数maptype="china"使用中国地图通过theme参数设置, 生成以下不同风格。使用方法如下opts.InitOpts(theme=ThemeType.XX),创建Map实例时,将这个值传入init_opts参数即可。
注:以上数据仅供参考(非官网提供数据),如果您对上述两个Excel爬取方式感兴趣,欢迎关注上面的专栏,后期介绍爬取方法。
本文源代码获取方式:关注并私信“popandepi”获取。
好了,今天的内容就到这里了。喜欢Python的小伙伴关注我,后续推出更加精彩的内容。如果有好的意见建议,欢迎大家下方留言。
本文禁止转载!