跳转至

第7章 绘制3D图表和统计地图

· animation模块 · basemap工具包 · mplot3d工具包 · 绘制常见的3D图表

Notes:

 学习目标 掌握 mplot3d工具包的用法 1

掌握 animation模块的用法 2

掌握

掌握

掌握 掌握 basemap工具包的用法 3

Notes:

目录页

7.1 使用mplot3d绘制3D图表 7.2 使用animation制作动图 7.3 使用basemap绘制统计地图 7.4 本章小结

目录页

7.1 使用mplot3d绘制3D图表 7.2 使用animation制作动图 7.3 使用basemap绘制统计地图 7.4 本章小结

7.1.1 mplot3d概述 matplotlib不仅专注于二维图表的绘制,也具有绘制3D图表、统计地图的功能,并将这些功能分别封装到工具包mpl_toolkits.mplot3d、mpl_toolkits.basemap中,另外可以结合animation模块给图表添加动画效果。

7.1.1 mplot3d概述 mplot3d是matplotlib中专门绘制3D图表的工具包,它主要包含一个继承自Axes的子类Axes3D,使用Axes3D类可以构建一个三维坐标系的绘图区域。

通过以下两种方式可以创建Axes3D类的对象。 第一种:Axes3D()方法。 第二种:add_subplot()方法。

7.1.1 mplot3d概述 Axes3D()方法 Axes3D()是构造方法,它直接用于构建一个Axes3D类的对象。 语法

Axes3D(fig, rect=None, *args, azim=-60, elev=30, zscale=None, sharez=None, proj_type='persp', **kwargs) fig:表示绘图区域所属的画布。 rect:表示确定三维坐标系位置的元组。

7.1.1 mplot3d概述 add_subplot()方法 在调用add_subplot()方法添加绘图区域时为该方法传入projection=‘3d’,即指定坐标系的类型为三维坐标系,并返回一个Axes3D类的对象。

import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = fig.add_subplot(111, projection='3d') 示例

7.1.1 mplot3d概述

官方推荐使用add_subplot()方法创建Axes3D类的对象。

7.1.1 mplot3d概述 Axes3D类中提供了一些用于设置标题和坐标轴的方法,关于这些方法及说明具体如下表所示。

7.1.2 绘制常见的3D图表 常见的3D图表包括3D线框图、3D曲面图、3D柱形图、3D散点图等。 Axes3D类中提供了一些绘制3D图表的方法,关于这些方法及其说明如下表所示。

7.1.2 绘制常见的3D图表 绘制3D线框图 Axes3D类的对象使用plot_wireframe()方法绘制线框图。 语法

plot_wireframe(self, X, Y, Z, *args, **kwargs) X,Y,Z:表示x、y、z轴的数据。 rcount,ccount:表示每个轴方向上使用的最大样本量,默认为50。若输入的样本量更大,则会采用降采样的方式减少样本的数量;若输入的样本量为0,则不会对相应轴方向的数据进行采样。 rstride,cstride:表示采样的密度。若仅使用参数rstride或cstride中任意一个,则另一个参数默认为0。

7.1.2 绘制常见的3D图表 绘制3D线框图

fig = plt.figure() ax = fig.add_subplot(111, projection='3d')

获取测试数量

X, Y, Z = axes3d.get_test_data(0.05)

绘制3D线框图

ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10) plt.show() 示例

7.1.2 绘制常见的3D图表 绘制3D曲面图 Axes3D类的对象使用plot_surface()方法绘制3D曲面图。 语法

plot_surface(self, X, Y, Z, *args, norm=None, vmin=None, vmax=None, lightsource=None, **kwargs) X,Y,Z:表示x、y、z轴的数据。 rcount,ccount:表示每个坐标轴方向上使用的最大样本量,默认为50。 rstride,cstride:表示采样的密度。 color:表示曲面的颜色。 cmap:表示曲面的颜色映射表。 shade:表示是否对曲面进行着色。

7.1.2 绘制常见的3D图表 绘制3D曲面图

x1 = np.arange(-5, 5, 0.25) y1 = np.arange(-5, 5, 0.25) x1, y1 = np.meshgrid(x1, y1) r1 = np.sqrt(x12 + y12) z1 = np.sin(r1) fig = plt.figure() ax = fig.add_subplot(111, projection='3d')

绘制曲面图

ax.plot_surface(x1, y1, z1, cmap=cm.coolwarm, linewidth=0, antialiased=False)

设置z轴刻度的范围、位置、格式

ax.set_zlim(-1.01, 1.01) 示例

7.1.3 实例1:三维空间的星星 本实例要求根据一组测试数据,绘制包含若干个五角星的3D散点图,并将位于指定值范围的五角星设置成指定的颜色:若10<z<20,设置五角星的颜色为#C71585 ;若z>=20,设置五角星的颜色为#008B8B;其他情况设置五角星的颜色为黄色 。

x = np.random.randint(0, 40, 30) y = np.random.randint(0, 40, 30) z = np.random.randint(0, 40, 30) 测试数据

7.1.3 实例1:三维空间的星星 标题为 “3D散点图”

星星总共有3种颜色,分别是#C71585、 '#008B8B‘ 、 'y' x、y、z轴的标签依次为 x轴、 y轴、 z轴

目录页

7.1 使用mplot3d绘制3D图表

7.2 使用animation制作动图 7.3 使用basemap绘制统计地图 7.4 本章小结

7.2.1 animation概述 与静态图表相比,添加了动画效果的动态图表更加生动形象,更能激发用户继续探索数据的热情。

7.2.1 animation概述 matplotlib在1.1版本的标准库中加入了动画模块——animation,使用该模块的Animation类可以实现一些基本的动画效果。Animation类是一个动画基类,它针对不同的行为分别派生了不同的子类,主要包括FuncAnimation和ArtistAnimation类。 FuncAnimation类表示基于重复调用一个函数的动画。 ArtistAnimation类表示基于一组固定Artist(标准的绘图元素,比如文本、线条、矩形等)对象的动画。

7.2.1 animation概述 FuncAnimation类 FuncAnimation是基于函数的动画类,它通过重复地调用同一函数来制作动画。 构造方法

FuncAnimation(fig, func, frames=None, init_func=None, fargs=None, save_count=None, *, cache_frame_data=True, **kwargs) fig:表示动画所在的画布。 func:表示每帧动画调用的函数。 frames:表示动画的长度(一次动画包含的帧数)。 init_func:表示用于开始绘制帧的函数,它会在第一帧动画之前调用一次。若未设置该参数,则程序将使用frames 序列中第一项的绘图结果。 fargs:表示传递给func函数的其它参数。 interval:表示更新动画的频率,以毫秒为单位,默认为200。

7.2.1 animation概述 正弦曲线移动效果

x = np.arange(0, 2*np.pi, 0.01) fig, ax = plt.subplots() line, = ax.plot(x, np.sin(x)) def animate(i): line.set_ydata(np.sin(x + i/10.0)) return line, def init(): line.set_ydata(np.sin(x)) return line, ani = FuncAnimation(fig=fig, func=animate, frames=100, init_func=init, interval=20, blit=False) 示例

7.2.1 animation概述 ArtistAnimation类 ArtistAnimation是基于一组Artist对象的动画类,它通过一帧一帧的数据制作动画。 语法

ArtistAnimation(fig, artists, interval, repeat_delay, repeat, blit, *args, **kwargs) fig:表示动画所在的画布。 artists:表示一组Artist 对象的列表。 interval:表示更新动画的频率,以毫秒为单位,默认为200。 repeat_delay:表示再次播放动画之前延迟的时长。 repeat:表示是否重复播放动画。

7.2.1 animation概述

x = np.arange(0, 2*np.pi, 0.01) fig, ax = plt.subplots() arr = [] for i in range(5): line = ax.plot(x, np.sin(x+i)) arr.append(line)

根据arr存储的一组图形创建动画

ani = ArtistAnimation(fig=fig, artists=arr, repeat=True) 示例

7.2.1 animation概述

大家若不希望使用PyCharm工具运行程序,也可以先安装ffmpeg或mencoder,之后使用Animation类的save()方法将每一帧动画存储为视频文件。

7.2.2 实例2:三维空间闪烁的星星 本实例要求为7.2.3小节绘制的3D散点图添加动画,实现五角星由红色到白色的闪烁效果 。

目录页

7.1 使用mplot3d绘制3D图表 7.2 使用animation制作动图

7.3 使用basemap绘制统计地图 7.4 本章小结

7.3.1 basemap概述 在数据可视化中,人们有时需将采集的数据按照其地理位置显示到地图上,常见于城市人口、飞机航线、矿藏分布等场景,有助于用户理解与空间有关的信息。basemap是matplotlib中的地图工具包,它本身不会参与任何绘图操作,而是会将给定的地理坐标转换到地图投影上,之后将数据交给matplotlib进行绘图。

7.3.1 basemap概述 安装basemap 在Anaconda中安装basemap的方式比较简单,可以直接在Anaconda Prompt工具中输入如下命令 : 语法

conda install basemap 执行以上命令后,conda命令会自动解析当前的Python环境并下载当前环境对应的basemap包。需要说明的是,在命令执行的过程中会询问用户是否安装,用户只需同意即可。

7.3.1 basemap概述 安装basemap 安装完成后,在Anaconda Prompt的命令提示符后面输入python,之后输入如下导入语句: 示例代码

from mpl_toolkits.basemap import Basemap 执行完以上语句后,若Anaconda Prompt中没有出现错误信息,则表明basemap安装成功,否则表明安装失败。

7.3.1 basemap概述 安装basemap

在Jupyter Notebook工具中导入basemap工具包时,运行会出现“KeyError:’PROJ_LIB’”错误。程序之所以产生“KeyError: ’PROJ_LIB’”错误,是因为basemap依赖的proj4模块未设置环境变量。大家可以参考https://blog.csdn.net/weixin_39278265/ article/details/84019778网址中推荐的解决方式。

7.3.1 basemap概述 使用basemap basemap工具包中主要包含一个表示基础地图背景的Basemap类,通过创建Basemap类的对象可以指定地图投影的类型和要处理的地球区域。 语法

Basemap(llcrnrlon=None, llcrnrlat=None, urcrnrlon=None, urcrnrlat=None, llcrnrx=None, …, ax=None) lon_0,lat_0:表示所需地图投影区域中心的经度或纬度。 llcrnrlon,llcrnrlat:表示地图投影区域左下角的经度或纬度。 urcrnrlon,urcrnrlat:表示地图投影区域右上角的经度或纬度。 width,height:表示所需地图投影区域的宽度和高度。 rsphere:表示投影中使用的球体的半径。

7.3.1 basemap概述 使用basemap basemap工具包中主要包含一个表示基础地图背景的Basemap类,通过创建Basemap类的对象可以指定地图投影的类型和要处理的地球区域。 语法

Basemap(llcrnrlon=None, llcrnrlat=None, urcrnrlon=None, urcrnrlat=None, llcrnrx=None, …, ax=None) resolution:表示包括海岸线、湖泊等的分辨率,可以取值为’c’(粗略,默认值)、’l’(低)、’i’(中级)、’h’(高)、’f’(完整)或None。 area_thresh:表示不会绘制海岸线或湖泊的阈值。 anchor:表示地图置于绘图区域的方式,默认为C,表示地图居中。 projection:表示地图投影的类型,默认值为cyl。

7.3.1 basemap概述 使用basemap

Projection参数的常用取值及说明如右表所示。

7.3.1 basemap概述 使用basemap 确定地图背景的投影区域之后,用户还需要对待处理的区域进行完善,为该区域绘制河岸线、河流和地区或国家边界等。Basemap类中提供了一些绘制地图背景的方法。

7.3.1 basemap概述 使用basemap 拥有地图背景之后便可以使用matplotlib在地图上绘制数据了。为方便用户操作,Basemap类中提供了一些在地图上绘制数据的方法(这些方法已经简单地转发到Axes实例方法,且进行了一些额外的处理和参数检查)。

7.3.2 实例3:美国部分城镇人口分布 美国是由50个州、1个联邦直辖特区和关岛等众多海外领土组成的国家,它的土地面积仅次于中国,但人口总量只有约3亿多,是一个名副其实的地广人稀的国家。

7.3.2 实例3:美国部分城镇人口分布 本实例要求根据下表的数据(存储于2014_us_cities.csv文件中),获取前500条数据,将获取的lat和lon两列的地理坐标转换到地图投影中,将pop列的数据绘制成气泡并显示到地图上。 2014年美国部分城镇的人口分布情况

图示 描述已自动生成

7.2.2 实例2:三维空间闪烁的星星

2014年美国部分城镇的人口分布情况

图示 描述已自动生成

地图中不同大小的圆点代表人口的数量,圆点越大说明该地域的人口越多,圆点越小说明该地域的人口越少。由图7-7可知,位于美国东北部的纽约州和位于西部的加利福尼亚州的人口数量最多。

目录页

7.1 使用mplot3d绘制3D图表 7.2 使用animation制作动图 7.3 使用basemap绘制统计地图

7.4 本章小结

7.4 本章小结

本章首先介绍了使用mplot3d工具包绘制3D图表,然后介绍了使用animation模块制作动画,最后介绍了使用basemap工具包绘制统计地图。通过对本章的学习,希望读者能够掌握这些工具包和动画模块的基本用法。