第14章 Matplotlib数据可视化
Matplotlib是Python中做数据绘图最常用的一个包,它提供了二维和三维绘图功能,能绘制曲线、直方图、柱状图、饼图、伪色图、等高线图、极坐标图、三维曲面、三维等高线等各种图,具有丰富的绘图定制功能,能在图中使用LaTeX标记输出数学符号和公式,生成具有出版品质的图。
Matplotlib最初是仿照MATLAB的绘图功能开发的,matplotlib.pyplot模块提供了类似于MATLAB的指令式绘图功能,一般介绍Matplotlib绘图功能的书也以介绍这种指令式绘图为主。但是这种方式适合于脚本化的程序中进行数据可视化,不适合于在GUI应用程序中绘图。实际上Matplotlib是完全采用面向对象的方式设计的,图的各个组成元素都有相应的类,通过类的接口可以完全控制Matplotlib的绘图功能,适合于在GUI应用程序中嵌入数据可视化功能。
本章主要介绍Matplotlib的面向对象的绘图功能,介绍Matplotlib绘图涉及的各个主要类的使用,特别是在GUI应用程序中的使用。
14.1 Matplotlib的基本用法
14.2 图的主要元素的面向对象操作
要对一个图(Figure)的各个组成元素进行编程操作,首先要搞清楚图的组成元素的名称及其对应的类,然后才可以使用类的属性和接口函数进行操作。
Matplotlib官方例子程序anatomy.py绘制的一个图完整地演示了一个图的各个组成元素,图14-3是anatomy.py运行时显示的图,实例Demo14_1目录下有这个文件,读者也可以从Matplotlib官网下载此程序的最新版本运行,并解读其中的代码。
图14-3 Matplotlib官方例子程序anatomy.py绘制的图
本节通过实例程序Demo14_2演示和介绍Matplotlib绘图的主要对象的操作方法。实例Demo14_2是基于模板mainWindowApp的项目,只有一个主窗口,程序运行时的界面如图14-4所示。
图14-4 示例Demo14_2运行时界面
14.3 交互操作
使用Matplotlib绘图还可以进行一些交互操作,最简单的就是使用与FigureCanvas类对象关联的NavigationToolbar类工具栏对图表进行交互操作。此外,还可以使用FigureCanvas类提供的事件处理功能对鼠标和键盘事件进行响应,从而实现一些交互操作。
图14-9 示例Demo14_3运行时界面
实例Demo14_3演示Matplotlib绘图的一些交互功能的实现,程序运行时界面如图14-9所示。这个程序实现了如下的一些功能:
- 对NavigationToolbar工具栏对象做了一些改造,使其显示中文标题和提示信息,并且在工具栏上插入了几个由自定义Actions创建的工具栏按钮。
- 当鼠标在子图上移动时,在状态栏里显示鼠标光标处的坐标数值。
- 当鼠标移动到一个子图上时,设置显示绿色背景颜色,鼠标离开子图时背景颜色恢复为白色,其功能类似于PyQt5中的hover()事件。
- 鼠标在曲线序列或散点序列上点击时,可以拾取序列上的数据点,并在状态栏上显示拾取的信息。
- 使用鼠标滚轮可以对子图进行缩放。NavigationToolbar工具栏提供的缩放功能只有矩形框选择区域放大,或鼠标右键拖动缩放。
14.4 典型二维图的绘制
在UI界面比较复杂时,希望在UI可视化设计时就放置一个类似于FigureCanvas的组件,而不是用代码生成界面组件。为此,我们设计了一个从QWidget继承的绘图组件类QmyFigureCanvas,在这个类里创建一个FigureCanvas对象、一个Figure对象和一个NavigationToolbar工具栏,构成一个绘图组件。在UI窗体可视化设计时,就可以放置一个QWidget组件然后提升为QmyFigureCanvas类,这样方便界面可视化设计。
基于自定义的类QmyFigureCanvas设计的示例Demo14_4,演示了几种常见的二维图的绘制。
图14-16 “火柴杆图”页面
14.5 三维数据绘图
Matplotlib可以绘制一些三维图形,如三维曲面图、三维线网图、三维散点图等。
本节通过实例Demo14_5简单介绍Matplotlib中绘制三维曲面、三维线网图和散点图的方法。三维数据也可以用二维图表现出来,例如一个三维曲面可以投影到X-Y平面上,用颜色表示一个点的Z轴的数值,这就是Axes类中的pcolormesh()、pcolor()等函数绘制的伪色图。
图14-18 示例Demo14_5运行时界面
<上一章> <回主页>