hans

hans

【Python】五、Matplotlib——《用Python做科学计算》


matplotlib
是 python 最著名的绘图库,它提供了一整套和 matlab 相似的命令 API,十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件,嵌入 GUI 应用程序中。

它的文档相当完备,并且 http://matplotlib.org/gallery.html
中有上百幅缩略图,打开之后都有源程序。因此如果你需要绘制某种类型的图,只需要在这个页面中浏览 / 复制 / 粘贴一下,基本上都能搞定。

本章节作为 matplotlib 的入门介绍,将较为深入地挖掘几个例子,从中理解和学习 matplotlib 绘图的一些基本概念。

1. 快速绘图#

matplotlib 的 pyplot 子库提供了和 matlab 类似的绘图 API,方便用户快速绘制 2D 图表。让我们先来看一个简单的例子:

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 1000)
y = np.sin(x)
z = np.cos(x**2)

plt.figure(figsize=(8,4))
plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
plt.plot(x,z,"b--",label="$cos(x^2)$")
plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.title("PyPlot First Example")
plt.ylim(-1.2,1.2)
plt.legend()
plt.show()

1668632373606.jpg

调用 figure 创建一个绘图对象,并且使它成为当前的绘图对象。

plt.figure(figsize=(8,4))

也可以不创建绘图对象直接调用接下来的 plot 函数直接绘图,matplotlib 会为我们自动创建一个绘图对象。如果需要同时绘制多幅图表的话,可以是给 figure 传递一个整数参数指定图标的序号,如果所指定序号的绘图对象已经存在的话,将不创建新的对象,而只是让它成为当前绘图对象。

通过 figsize 参数可以指定绘图对象的宽度和高度,单位为英寸;dpi 参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为 80。因此本例中所创建的图表窗口的宽度为 8*80
= 640 像素。
下面的两行程序通过调用 plot 函数在当前的绘图对象中进行绘图:

plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
plt.plot(x,z,"b--",label="$cos(x^2)$")

plot 函数的调用方式很灵活,第一句将 x,y 数组传递给 plot 之后,用关键字参数指定各种属性:
label :
给所绘制的曲线一个名字,此名字在图示 (legend) 中显示。只要在字符串前后添加 "$" 符号,matplotlib 就会使用其内嵌的 latex 引擎绘制的数学公式。
color : 指定曲线的颜色
linewidth : 指定曲线的宽度
第二句直接通过第三个参数 "b--" 指定曲线的颜色和线型,这个参数称为格式化参数,它能够通过一些易记的符号快速指定曲线的样式。其中 b 表示蓝色,"--" 表示线型为虚线。在 IPython 中输入
"plt.plot?" 可以查看格式化字符串的详细配置。
接下来通过一系列函数设置绘图对象的各个属性:

plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.title("PyPlot First Example")
plt.ylim(-1.2,1.2)
plt.legend()

xlabel : 设置 X 轴的文字
ylabel : 设置 Y 轴的文字
title : 设置图表的标题
ylim : 设置 Y 轴的范围
legend : 显示图示
最后调用 plt.show () 显示出我们创建的所有绘图对象。

2. 绘制多轴图#

一个绘图对象 (figure) 可以包含多个轴 (axis),在 Matplotlib 中用轴表示一个绘图区域,可以将其理解为子图。上面的第一个例子中,绘图对象只包括一个轴,因此只显示了一个轴 (子图)。我们可以使用 subplot 函数快速绘制有多个轴的图表。subplot 函数的调用形式如下:

subplot(numRows, numCols, plotNum)

subplot 将整个绘图区域等分为 numRows 行 *
numCols 列个子区域,然后按照从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域的编号为 1。如果 numRows,numCols 和 plotNum 这三个数都小于 10 的话,可以把它们缩写为一个整数,例如 subplot (323) 和 subplot (3,2,3) 是相同的。subplot 在 plotNum 指定的区域中创建一个轴对象。如果新创建的轴和之前创建的轴重叠的话,之前的轴将被删除。

下面的程序创建 3 行 2 列共 6 个轴,通过 axisbg 参数给每个轴设置不同的背景颜色。

for idx, color in enumerate("rgbyck"):
    plt.subplot(320+idx+1, axisbg=color)
plt.show()

1668632479996.jpg


enumerate 是枚举、列举的意思,主要使用对象是列表(list)和字符串(string)。enumerate 将其组成一个索引序列,利用它可以同时获得索引(index)和内容(item)

list = ["a", "b", "c", "d"]
for index, item in enumerate(list):
    print index, item
>>>
0 a
1 b
2 c
3 d

如果希望某个轴占据整个行或者列的话,可以如下调用 subplot:

plt.subplot(221) # 第一行的左图
plt.subplot(222) # 第一行的右图
plt.subplot(212) # 第二整行
plt.show()

1668632527764.jpg

想看完整内容请去原文地址。
本文参考自: http://old.sebug.net/paper/books/scipydoc/matplotlib_intro.html

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。