使用Python实现画一个中国地图


Posted in Python onNovember 23, 2019

为什么是Python

先来聊聊为什么做数据分析一定要用Python或R语言。编程语言这么多种,Java, PHP都很成熟,但是为什么在最近热火的数据分析领域,很多人选择用Python语言?

数据分析只是一个需求,理论上来讲,任何语言都可以满足任何需求,只是麻烦与简易之别。Python这门语言诞生也相当之早,它的第一个版本是26年前发表的,曾经(或者说当前)也被用于web开发,但是就流行程度来说,远远干不过Java和PHP。东方不亮西方亮,在与Java干仗失败的这20几年时光里,Python练就了一身独门武艺,是Java和PHP远远不及的(当然以后是不是能追得上来,目前还不好说)。你要说做个博客网站,Python的特长不在这里,PHP和Java也是分分钟的事情。你要说做个BBS网站,做个电商网站,PHP手到擒来。Python在这些方面和Java或者PHP竞争,基本就是作死的节奏,虽然也有django这样的框架,但流行程度远远不及其他语言。但在这些年默默的失败背后,有一帮研究人员用Python干出了一些惊天地泣鬼神的神器,使Python在数据研究领域做到了除了R语言以外基本无人能及的地步。

Jupyter

首先,第一神器是Jupyter。如果你是第一次使用,可能搞不清楚它的开发者做这么个鬼东西出来干什么,说它是博客系统也不像,说它是web服务器也不像,但它就是有用。因为我们传统的web开发首先想的就是面向公众,你做一个服务器就是要服务成千上万浏览器的,当然Jupyter也可以服务众多浏览器,但它更多的还是方便研究人员,对研究人员来说简直是太方便了,你把代码像写文章一样直接写在输入框里,然后在本页面直接就看到了这个代码的结果,随时修改,随时展现,文码混排,是Markdown的一个增强版,毕竟Markdown还只能显示文字,最多再加上一些图片,而Jupyter是可以直接运行Python代码的。当然,也有些人试图在Jupyter里运行PHP或Java代码,但显然成不了气候。因为Python这个语言天生就是脚本语言,可能将来唯一有希望往里移植的就是Javascript,这货也是一个脚本语言。脚本语言的好处就是不用编译,一行一个结果。纵观计算机语言发展历史,就是一个从繁到简的过程,C语言需要编译+链接才能运行,Java只要javac一下,把编译和链接合二为一,PHP更简单,直接运行就行了,连编译都省了。但是还不够直接,因为还要编写一个.php文件存盘,然后才能运行,到了Python以及其它脚本语言这里,可以直接在壳里运行,但最大的问题是运行可以运行,无法保存,要保存就又要跟传统方式一样,找个编辑器来,或者vi,存成文件以后才可以运行。Jupyter最大的优点就是:它本身还是一个外壳环境,可以运行脚本,但同时也帮你自动把这些脚本代码保存了下来,不但保存脚本代码,并且你插在脚本代码当中的所有注释不是普通注释,而是各种格式化的Markdown都一并帮你保存下来,并且可以随时修改。所以它兼具了脚本外壳和文件管理系统的优点,从此你开发Python代码再也不用先在IDE里写好代码,然后再到终端里去运行,而直接在一个web页面上就全部搞定了。Java有这样的工具吗?PHP有这样的工具吗?没有,所以我们必须选择Python。

Pandas

第二神器是Pandas。如果我让你读取一个csv文件,然后求每一列数据的平均值,最大值,最小值,方差,用Java或PHP怎么做?你首先要fopen一个文件,然后一行一行读进来,再给它整个数据结构,然后弄个循环计算,最后你可能还要fclose这个文件。总之代码一坨,麻烦死。而Python语言因为有Pandas这个神器,一行代码搞定:

df = pd.read_csv('a.csv')

行了,从此以后,df就是这个DataFrame,它本身就是一个强大的数据结构,也可以把它理解成mysql数据库中的一张表吧,各种增删改查,求总和,求平均都是一行代码的事情。所以有这样强大的库,研究人员有什么理由选择Java?

scikit-learn

第三神器scikit-learn,一般缩写为sclearn,各种机器学习算法,基本上只要你能想得到的,线性回归,逻辑回归,SVM,随机森林,最近邻居等等等等,各种算法全部在这里面,简而言之,只有你想不到,没有它做不到,不详述。所以这就是为什么玩机器学习必选Python的原因,你给我找一个Java或者PHP有这样多种算法的库来?

matplotlib

第四神器是matplotlib。如果我让你根据上面csv文件里的信息,画一个图,用Java该怎么做?你当然会去找第三方插件库,然后又是一通折腾,终于把图做出来,然后编译,然后运行。如果我要改配色呢?如果我要求画地图呢?如果要画热力图呢?那个麻烦就不是一星半点,而对于matplotlib来说,简直就是小菜一碟。简单的直方图就不说了,下面重点介绍如何用matplotlib配合Basemap画一个中国地图。

安装Basemap

先安装相应的组件。我假定你已经都安装好了Python以及Jupyter等等。如果没有安装的话,就去尝试一下brew install python3和brew install jupyter吧,网上有很多教程。

然后你需要用pip3 install很多我们下面可能需要用到的库。但是因为我们要用一个叫做Basemap的库,而这个库没有办法用简单的pip3 install安装,所以稍多两个步骤:

brew install geos
pip3 install https://github.com/matplotlib/basemap/archive/v1.1.0.tar.gz

开始画图

启动Jupyter之后,我们还是本着从最简单的代码开始。先画一个世界地图:

import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

plt.figure(figsize=(16,8))
m = Basemap()
m.drawcoastlines()

plt.show()

前面两行引入相应的库,真正的代码就4行,够简单吧。第1行甚至可以不写,它定义了图的大小。第2行我们创建一个地图,第3行把海岸线画上,第4行显示这个地图,就是这样:

使用Python实现画一个中国地图

你用Java的4行代码画一个地图出来?

然后我们开始画上国家,又是1行代码:

m.drawcountries(linewidth=1.5)

就变成了这样:

使用Python实现画一个中国地图

用Java可能吗?用PHP可能吗?

如果我们想显示中国地图,只需要在创建Basemap时指定一下经纬度就行了:

m = Basemap(llcrnrlon=73, llcrnrlat=18, urcrnrlon=135, urcrnrlat=53)

然后就得到了中国地图:

使用Python实现画一个中国地图

看上去有点变形,这是因为我们没有添加任何投影的原因,Basemap提供24种不同的投影方式,你可以自己一个个试一下,比较常用的是兰勃特投影,我们添加一下:

m = Basemap(llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, projection='lcc', lat_1=33, lat_2=45, lon_0=100)

这次终于看上去比较正常了:

使用Python实现画一个中国地图

我们想加上省的边界怎么办呢?Basemap缺省的包里没有中国的省区,只有美国的州,毕竟是美国人做的嘛。不过好在世界很大,有专门的国际组织干这事,在这里你可以下载全世界任何一个国家的行政区划Shape文件,然后我们给它加上:

m.readshapefile('CHN_adm_shp/CHN_adm1', 'states', drawbounds=True)

然后就得到了下图:

使用Python实现画一个中国地图

再往后,你还可以往图上改颜色啦,写数字啦,这些就留待你研究吧。总之,我想说的是,用Python画地图真的超容易。

最后再为Java和PHP美言几句:大家分工不同,Java和PHP虽然做这样的数字研究不是很方便,但还是非常适合web开发的,而Python在这方面并不适合。所以通常的做法是:首先用Python验证算法,经过一系列复杂的计算,把算法确定下来之后,当要应用到web上的时候,再用Java或者PHP把最终形成的结论重写一遍,这样就能充分利用各种语言的优势。

以上这篇使用Python实现画一个中国地图就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python原始套接字编程示例分享
Feb 21 Python
Python random模块(获取随机数)常用方法和使用例子
May 13 Python
python操作redis的方法
Jul 07 Python
Python 数据结构之旋转链表
Feb 25 Python
Python中将变量按行写入txt文本中的方法
Apr 03 Python
对python程序内存泄漏调试的记录
Jun 11 Python
Python3实现统计单词表中每个字母出现频率的方法示例
Jan 28 Python
Python 切分数组实例解析
Nov 07 Python
python接口自动化如何封装获取常量的类
Dec 24 Python
Python实现动态循环输出文字功能
May 07 Python
Python改变对象的字符串显示的方法
Aug 01 Python
python实现登录与注册系统
Nov 30 Python
用Python画小女孩放风筝的示例
Nov 23 #Python
python实现对列表中的元素进行倒序打印
Nov 23 #Python
Python实现打印实心和空心菱形
Nov 23 #Python
在Python中使用turtle绘制多个同心圆示例
Nov 23 #Python
python实现画循环圆
Nov 23 #Python
解决python彩色螺旋线绘制引发的问题
Nov 23 #Python
Mac 使用python3的matplot画图不显示的解决
Nov 23 #Python
You might like
mysql5写入和读出乱码解决
2006/11/25 PHP
php读取csv实现csv文件下载功能
2013/12/18 PHP
PHP简单实现文本计数器的方法
2016/04/28 PHP
jquery 获取表单元素里面的值示例代码
2013/07/28 Javascript
javascript实现全角半角检测的方法
2015/07/23 Javascript
JavaScript实现的浮动层框架用法实例分析
2015/10/10 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
移动端横屏的JS代码(beta)
2016/05/16 Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
2016/06/22 Javascript
深入浅析JavaScript中的Function类型
2016/07/09 Javascript
AngularJS 异步解决实现方法
2017/06/12 Javascript
vue 2.0项目中如何引入element-ui详解
2017/09/06 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
vue 实现小程序或商品秒杀倒计时
2019/04/14 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
[07:55]2014DOTA2 TI正赛第三日 VG上演推进荣耀DKEG告别
2014/07/21 DOTA
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
python通过函数属性实现全局变量的方法
2015/05/16 Python
python基础_文件操作实现全文或单行替换的方法
2017/09/04 Python
python多线程同步实例教程
2019/08/11 Python
Python开发之基于模板匹配的信用卡数字识别功能
2020/01/13 Python
浅谈tensorflow之内存暴涨问题
2020/02/05 Python
python 爬取英雄联盟皮肤并下载的示例
2020/12/04 Python
如何用 Python 处理不平衡数据集
2021/01/04 Python
LINUX下线程,GDI类的解释
2016/12/14 面试题
保护环境倡议书
2014/04/14 职场文书
电子商务优秀毕业生求职信
2014/07/11 职场文书
机电系毕业生求职信
2014/07/11 职场文书
三方协议书
2015/01/27 职场文书
单位推荐信范文
2015/03/27 职场文书
社区文明倡议书
2015/04/28 职场文书
党支部意见范文
2015/06/02 职场文书
2016年员工年度考核评语
2015/12/02 职场文书
文案策划岗位个人自我评价(范文)
2019/08/08 职场文书
golang 如何通过反射创建新对象
2021/04/28 Golang
Java如何实现树的同构?
2021/06/22 Java/Android