第四章:交互式绘图接口
本章我们将展示Python的绘图功能以及如何在IPython中交互式地使用它们。
NumPy为处理大量的多维数组结构的数据提供了高效的方法。但是看行行列列的数字总不如直接看曲线图、散点图、折线图、图片等图像来的直观。Matplotlib是一个使用NumPy数据生成高质量图像的Python包,其包含的内容非常丰富。它提供了和世界上工程与科学领域非常流行的商业软件atlab非常相似的简单而高级的绘图接口。Matplotlib和IPython结合的相当好。
我们也会介绍一些图形用户接口(GUI)编程方面的内容。全面覆盖这个丰富的主题远远超出了本书的范围。所以我们在本章中将只是看一些简单的示例。下面是本章包含的内容:
使用Matplotlib绘图
图像处理技术
地理地图
GUI简介
和IPython的事件循环集成进行GUIs的设计和debug
Matplotlib的图形功能
有大量的Python包可以用来进行去先绘制,但是截止目前应用最为广泛的一个是Matplotlib。它是功能最为完整与强大的一个绘图库。它既可以用于交互式可视化,也能用来生成科学出版的高质量图像。除此之外,他的高级接口使得它使用起来非常容易。
在这一节中,我们将展示Matplotlib提供的一些功能以及怎样方便地在IPython使用它。
开始使用IPython进行交互式可视化
IPython实现了一循环集成系统,这个系统允许从展示命令行接口启动图形窗口的同时不阻断控制台的使用。这一特点在使用Maplotlib或创建图形用户接口的时候非常有用。
Matplotlib的使用
使用事件循环集成机制使得在IPython中可以交互式地展现图形。这些图形可以通过命令行接口动态地更新。%pylab魔法命令(或在IPython启动的时候开启--pylab选项)将会自动地激活这个集成功能。也可以为Matplotlib和IPython选择后台渲染器,例如,使用--pylab qt,当然这个需要安装PyQt或PySide。
我们将假设在这一章中%pylab模式一直处于激活状态。当在一个脚本而不是IPython交互环境时,我们可以在脚本的头部添加上from pylab import *这个命令来实现该模式的激活。在一个Python模块中,使用import matplotlib.pyplot as plt也许是个更好的主意,因为这样就可以让Matplotlib对象处于Matplotlib所定义的命名空间内。
有一点值得主意,采用脚本方式生成图像的方式与在IPython中有稍微的不同。在一个脚本中,图像只在调用show()函数的时候才会被显示,一般情况下我们都会将这个函数的调用放在脚本的最末端;然而在IPython的命令行接口中,图像是随着每一个绘图函数随时更新的。
交互式导航
当使用Matplotlib展示一个图像的时候,窗口包含一些用于改变图形选项的带有图形式样的交互式导航(放大、缩小等)。也可以通过窗口将图像保存为位图或矢量格式。
IPython notebook中的Matplotlib
Matplotlib也可以在notebook中使用。当我们以ipython notebook --pylab inline命令启动notebook时,绘制的图像会以图片的形式出现在输出框内,且可以以base64字符串的形式保存在IPYNB文件中。如若没有开启inline选项,图像会像使用IPython时一样在一个单独分离出来的窗口显示。也可以在ipython notebok中使用%pylab inline命令激活这个选项。
标准绘图
在这一节中,我们将看到一些标准绘图的样例,如直线、曲线、散点图和条形图。在下一节,我们将看到图片和地图。但是Matplotlib提供的功能远比我们在这里提到的要多的多,如它还提供了3D绘图、几何形状、向量域等功能。
曲线图
使用Matplotlib绘制曲线图实际上就是绘制一些连续的线段,当线段的数量足够多时,这些线段组合起来就足够平滑让我们的肉眼开起来就像曲线一样。绘制某一个数学函数在一给定区间内的图像就像NumPy根据给定的数值显示数组一样。
例如,一个时间序列信号就可以以表示为一个一定时间段内样例值组成的一维向量(例如,每毫秒1KHz的取样频率),这样信号每一秒就是1000个数据单元组成的向量。plot函数可以用来在屏幕上绘制出这个信号图像。如下:
【图】
这里我们使用独立随机值生成了一个向量。生成的信号就是所谓的白噪音信号(具有平坦功率谱密度的随机信号)。当在开启--pylab inline选项的notebook中绘制这个图像的时候,Matplotlib将生成一个这个曲线图的图片并自动地将其插入到输出框内。
但plot函数接收一个单向量作为参数的时候,它将认为这个向量包含了y轴的值,x轴将自动的生成为0到len(y)之间的整数值。我们可以使用`plot(x,y)命令来专门指定x轴的坐标。
散点图
散点图使用但像素或其他的标识展现二位空间点的集合。让我们继续进行我们的cities实例。假设我们在正确的目录中(citiesdata alias),我们可以加载数据并绘制出所有城市的地理坐标:
In [1]: import pandas as pd
In [2]: cd citiesdata
In [3]: filename = 'worldcitiespop.txt'
In [4]: data = pd.read_csv(filename)
In [5]: plot(data.Longitude, data.Latitude, ',')
【图】
在这个示例中,我们绘制了所有城市的经度(x轴)和纬度(y轴)。plot函数的第三个参数(',')用来指定标识类型。在这里默认使用单像素来表示每一个城市。虽然有些扭曲,我们依然可以从中识别出各大洲的形状。扭曲的原因是我们是在一个笛卡尔坐标系中绘制的地理坐标点,相对来说,更适合绘制地理坐标的方式是采用地图投影法。我们将会在本章后续部分回来再谈这个问题。
条形图
条形图一班用来绘制表现不同间隔内的数值分布的直方图。Maplotlib的hist函数接受一个数值向量来绘制直方图。bins关键字用来指定划割块的数目或划割块列表。