matplotlib-base_matplotlib3d柱状图

matplotlib-base_matplotlib3d柱状图作者:Vamei出处:http://www.cnblogs.com/vamei欢迎转载,也请保留这段声明。谢谢!在数据可视化过程中,我们常常需要将数据根据其采集的地理位置在地图上显示出来。比如说我

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

 

在数据可视化过程中,我们常常需要将数据根据其采集的地理位置在地图上显示出来。比如说我们会想要在地图上画出城市,飞机的航线,乃至于军事基地等等。通常来说,一个地理信息系统都会带有这样的功能。今天我们讨论如何在Python上实现,并且使用免费的工具包。

 

matplotlib是Python常用的数据绘制包。它基于numpy的数组运算功能。matplotlib绘图功能强大,可以轻易的画出各种统计图形,比如散点图,条行图,饼图等。matplotlib常与numpy和scipy相配合,用于许多研究领域。他们是免费工具,但其功能足可以与科研界的大佬Matlab竞争。

Basemap是Matplotlib的一个子包,负责地图绘制。在数据可视化过程中,我们常需要将数据在地图上画出来。比如说我们在地图上画出城市人口,飞机航线,军事基地,矿藏分布等等。这样的地理绘图有助于读者理解空间相关的信息。

 

我们下面用Basemap画出亚洲主要城市的人口。如下图,人口的数量用圆圈的大小表示:

matplotlib-base_matplotlib3d柱状图

数据如下(我从Wikipedia上整理的,你可以随意使用)。将数据保存在文件major_city:

Shanghai 23019148  31.23N  121.47E  China
Mumbai   12478447  18.96N  72.82E   India
Karachi  13050000  24.86N  67.01E   Pakistan
Delhi    16314838  28.67N  77.21E   India
Manila   11855975  14.62N  120.97E  Philippines
Seoul    23616000  37.56N  126.99E  Korea(South)
Jakarta  28019545   6.18S  106.83E  Indonesia
Tokyo    35682460  35.67N  139.77E  Japan
Peking   19612368  39.91N  116.39E  China

第一列是城市名,第二列是人口,第三第四列为纬度和经度,最后一列为所在国家。

 

下面是我的Python代码,用以绘制上面的地图:

matplotlib-base_matplotlib3d柱状图matplotlib-base_matplotlib3d柱状图View Code

# Written by Vamei, http://www.cnblogs.com/vamei/ # Feel free to use or modify this script.

from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt import numpy as np #============================================# read data
names = [] pops = [] lats = [] lons = [] countries = [] for line in file("../data/major_city"): info = line.split() names.append(info[0]) pops.append(float(info[1])) lat = float(info[2][:-1]) if info[2][-1] == 'S': lat = -lat lats.append(lat) lon = float(info[3][:-1]) if info[3][-1] == 'W': lon = -lon + 360.0 lons.append(lon) country = info[4] countries.append(country) #============================================ # set up map projection with # use low resolution coastlines.
map = Basemap(projection='ortho',lat_0=35,lon_0=120,resolution='l') # draw coastlines, country boundaries, fill continents.
map.drawcoastlines(linewidth=0.25) map.drawcountries(linewidth=0.25) # draw the edge of the map projection region (the projection limb)
map.drawmapboundary(fill_color='#689CD2') # draw lat/lon grid lines every 30 degrees.
map.drawmeridians(np.arange(0,360,30)) map.drawparallels(np.arange(-90,90,30)) # Fill continent wit a different color
map.fillcontinents(color='#BF9E30',lake_color='#689CD2',zorder=0) # compute native map projection coordinates of lat/lon grid.
x, y = map(lons, lats) max_pop = max(pops) # Plot each city in a loop. # Set some parameters
size_factor = 80.0 y_offset = 15.0 rotation = 30
for i,j,k,name in zip(x,y,pops,names): size = size_factor*k/max_pop cs = map.scatter(i,j,s=size,marker='o',color='#FF5600') plt.text(i,j+y_offset,name,rotation=rotation,fontsize=10) plt.title('Major Cities in Asia & Population') plt.show()

程序分为两个部分,第一部分为从文件读取数据并处理。第二部分才是真正用basemap绘图。

 

地图的大小、投影方法等重要信息,是在Basemap()的调用中实现的:

map = Basemap(projection=ortho,lat_0=35,lon_0=120,resolution=l)

projection参数规定了投影方法。改变投影方法,绘图结果也将非常不同。

 

城市所在位置是经纬度。我们想要把经纬度对应图像的像素点,需要转换:

x, y = map(lons, lats)

这个语句转换为图像上的位置。

 

最后,调用绘制散点图的方法scatter():

cs = map.scatter(i,j,s=size,marker=o,color=#FF5600)

在地图上画出数据。

 

总结

matplotlib中的Basemap是很好用的,具有专业标准的地图绘制工具。它可以与matplotlib的一般绘图功能结合,在地图上绘制数据。

 

文中需要的软件包:

numpy, matplotlib, mpl_toolkits

可以使用pip来下载安装各个包。

 

在Ubuntu的repository中,你可以找到python-matplotlib包。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/167708.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • “度”思考

    “度”思考

    2022年1月12日
    52
  • Centos7部署k8s集群及应用

    Centos7部署k8s集群及应用

    2022年2月15日
    48
  • 工作流引擎Activiti使用总结[通俗易懂]

    工作流引擎Activiti使用总结[通俗易懂]转载自:工作流引擎Activiti使用总结1.简单介工作流引擎与Activiti对于工作流引擎的解释请参考百度百科:工作流引擎1.1我与工作流引擎在第一家公司工作的时候主要任务就是开发OA系统,当然基本都是有工作流的支持,不过当时使用的工作流引擎是公司一些牛人开发的(据说是用一个开源的引擎修改的),名称叫CoreFlow;功能相对Activiti来说比较弱,但是能满足日常的使用,当然也有不少的问…

    2022年7月11日
    28
  • STM32F103C8T6最小系统

    STM32F103C8T6最小系统单片机最小系统一般有晶振电路、电源电路、复位电路以及调试电路组成。本文以STM32F103C8T6为例,介绍最小电路的设计和要注意的问题。

    2022年6月20日
    39
  • 国产系统中标麒麟neokylin上的视频监控系统

    国产系统中标麒麟neokylin上的视频监控系统一、功能特点采用分层设计,整体总共分三级界面,一级界面是整体布局,二级界面是单个功能模块,三级界面是单个控件。子控件包括饼图、圆环图、曲线图、柱状图、柱状分组图、横向柱状图、横向柱状分组图、合格率控件、百分比控件、进度控件、设备状态面板、表格数据、地图控件、视频控件等。二级界面可以自由拖动悬浮,支持最小化隐藏、最大化关闭、响应双击自定义标题栏。数据源支持模拟数据(默认)、数据库采集、串口通信(需定制)、网络通信(需定制)、网络请求等,可自由设定每个子界面的采集间隔即数据刷新频率。采用纯QWidg

    2022年8月10日
    16
  • 系统无法开始服务器进程。请检查用户名和密码。 (Exception from HRESULT: 0x8000401A)…[通俗易懂]

    系统无法开始服务器进程。请检查用户名和密码。 (Exception from HRESULT: 0x8000401A)…[通俗易懂]开始-运行-cmd,输入aspnet_regiis.exe-i重新注册iis或者出现以下错误:检索COM类工厂中CLSID为{000209FF-0000-0000-C000-000000000046}的组件失败,原因是出现以下错误:8000401a因为配置标识不正确,系统无法开始服务器进程。请检查用户名和密码。(异常来自HRESULT:0x8000401A)。解决方案:1….

    2022年8月20日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号