当前位置: 首页 > 科技观察

用Python画中国地图

时间:2023-03-18 19:12:14 科技观察

为什么是Python?下面说说为什么一定要用Python或者R语言做数据分析。编程语言那么多,Java和PHP已经很成熟了,但是为什么在最近很火的数据分析领域很多人选择使用Python语言呢?数据分析只是一个需求。从理论上讲,任何一种语言都可以满足任何要求,但这只是麻烦easy和simple之间的区别。Python语言也诞生得相当早。它的第一个版本发布于26年前。它曾经(或现在)也用于web开发,但就流行程度而言,它远远落后于Java和Python。PHP。东不明,西明。在过去20年与Java的较量失败中,Python练就了一身绝活,远远落后于Java和PHP(当然以后能不能赶上还不好说)。要做博客站,Python的特长不在这里,PHP和Java也是分分钟的事情。如果你想建立一个BBS网站或电子商务网站,PHP就在你的指尖。Python在这些方面跟Java或者PHP竞争,基本上是在作死的节奏。虽然也有django这样的框架,但是远不如其他语言流行。但在这些年无声无息的失败背后,一群研究者用Python创造了一些惊天动地的神器,使得Python在数据研究领域基本上是除了R语言之外的佼佼者。Jupyter首先,法宝是Jupyter。如果你是第一次使用它,你可能不知道它的开发者拿这么个鬼东西干什么。它看起来不像博客系统或网络服务器,但它很有用。因为传统的web开发我们首先想到的就是面向大众。您需要作为服务器为数千个浏览器提供服务。当然,Jupyter也可以服务于很多浏览器,只是对于研究人员来说更加方便。简直太方便了。你像写文章一样直接在输入框里写代码,然后你就可以直接在这个页面看到代码的结果。可以随时修改,随时展示,文字和代码混编。是markdown的增强版,毕竟Markdown只能显示文本,顶多加点图片,Jupyter可以直接运行Python代码。当然,也有人尝试过在Jupyter中运行PHP或Java代码,但显然行不通。因为Python本质上是一种脚本语言,所以未来移植它的唯一希望就是Javascript,它也是一种脚本语言。脚本语言的优点是不用编译,一行一个结果。纵观计算机语言的发展史,就是一个由复杂到简单的过程。C语言需要编译链接才能运行。Java只需要javac来结合编译和链接。PHP比较简单,直接运行就可以了,连编译都省了。但是不够直接,因为你要写一个.php文件保存,然后才能运行。说到Python等脚本语言,可以直接在shell中运行,但是最大的问题是可以运行,但是不能保存。你需要保存它。和传统方式一样,找个编辑器,或者vi,保存成文件再运行。Jupyter最大的优势在于它仍然是一个可以运行脚本的shell环境,但同时它也帮你自动保存这些脚本代码。它不仅保存了脚本代码,而且你在脚本代码中插入的所有评论都不是普通的评论,而是各种格式的Markdowns为你保存在一起,可以随时修改。所以它兼有脚本shell和文件管理系统的优点。从此以后,开发Python代码时不再需要先在IDE中编写代码,然后在终端中运行,而是直接在一个网页上就可以完成。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等。如果没有安装,试试brewinstallpython3和brewinstalljupyter,网上有很多教程。然后需要使用pip3安装下面我们可能需要用到的很多库。但是因为我们要使用一个叫Basemap的库,而这个库不能用简单的pip3install安装,所以多了两步:brewinstallgeospip3installhttps://github.com/matplotlib/basemap/archive/v1.1.0.tar。gz开始绘图并启动Jupyter后,我们还是从最简单的代码开始。先画一张世界地图:importmatplotlib.pyplotaspltfrommpl_toolkits.basemapimportBasemapplt.figure(figsize=(16,8))m=Basemap()m.drawcoastlines()plt.show()前两行介绍对应的库,真正的代码是4OK,很简单。第1行甚至可以省略,它定义了图形的大小。第2行我们创建一张地图,第3行绘制海岸线,第4行显示地图,仅此而已:您用4行代码用Java绘制地图?然后我们开始绘制国家,另外1行代码:m.drawcountries(linewidth=1.5)变成这样:IsitpossibletouseJava?是否可以使用PHP?如果我们要显示中国的地图,只需要在创建Basemap的时候指定经纬度即可:m=Basemap(llcrnrlon=73,llcrnrlat=18,urcrnrlon=135,urcrnrlat=53)那么我们就得到了地图中国:看起来有点变形,这是因为我们没有加投影,Basemap提供了24种不同的投影方式,大家可以自己做一个试试看,比较常用的是朗伯投影,我们加一下:m=Basemap(llcrnrlon=77,llcrnrlat=14,urcrnrlon=140,urcrnrlat=51,projection='lcc',lat_1=33,lat_2=45,lon_0=100)这次终于正常了:如果我们想添加省份边界?Basemap默认包不包含中国省份,只包含美国各州。毕竟是美国人造的。幸运的是,世界很大,有专门的国际组织来做这件事。这里可以下载世界上任意一个国家的行政区划Shape文件,然后我们添加:m.readshapefile('CHN_adm_shp/CHN_adm1','states',drawbounds=True)然后得到下图:在以后还可以在图上改颜色,写数字,留给你研究。总而言之,我想说用Python绘制地图非常简单。***Java和PHP再多说几句:大家分工不同。Java和PHP虽然做这种数字研究不是很方便,但是还是很适合web开发的,而Python在这方面不太适合。所以通常的做法是:先用Python来验证算法,经过一系列复杂的计算,算法确定后,要应用到web上,再用Java或者PHP重写最后的结论,这样可以充分利用各种语言的优点。