您的位置:首页 > 编程语言 > Python开发

Python科学计算数据可视化模块-Matplotlib

2016-04-27 14:13 806 查看

Matplotlib

python科学计算系列


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

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

gallery展示页面的地址

简单介绍

该内容来自pyplot_tutorial官方文档

plt.plot()



你可能想知道,为啥设置了一下plt.plot([1,2,3,4]),咋就Y轴成了1-4,X轴成了1-3呢?这是因为,有种原因叫规定!matplotlib默认只有一组列表数据时为Y值,并自动生成X轴。由于Python范围默认从0开始,且具有与Y轴相同的长度,所以X轴数据为[0,1,2,3]。plt.ylabel(‘some numbers’),这是什么,不用解释吧。。

官方说plot()方法非常牛,接受任意数量数据:





然后,你又想了。这次plt.plot([1,2,3,4], [1,4,9,16], ‘ro’)是什么。。是这样的,对于plot()方法,有第三个参数,可以设定颜色和图类型。具体是传承自MATLAB,默认是’b-‘--一条坚实的蓝线。这里,红色圈圈‘ro’ – 太形象,容易记。

下面的例子是在一个命令中使用数组来绘制不同样式plot,自行看一下,易懂。



控制线条 – 具体见 matplotlib.lines



一张图上多字图 – subplot()

先用一张图介绍一下matplotlib.pylab的subplot()函数:



创建两个子图



横纵坐标轴上的文字

以上内容太费劲,不够简单粗暴


快速绘图

先明白几个概念



Figure

The whole figure (marked as the outer red box). The figure keeps track of all the child Axes.

Axes

This is what you think of as ‘a plot’, it is the region of the image with the data space (marked as the inner blue box). A given figure can contain many Axes, but a given Axes object can only be in one Figure. The Axes contains two (or three in the case of 3D) Axis objects (be aware of the difference between Axes and Axis)

Axis

x label, y label, title

pyplot子库 – The easiest way to create a new figure is with pyplot

matplotlib的pyplot子库提供了和matlab类似的绘图API,方便用户快速绘制2D图表。

pylab模块

matplotlib还提供了名为pylab的模块,其中包括了许多numpy和pyplot中常用的函数,方便用户快速进行计算和绘图,可以用于IPython中的快速交互式使用。

模糊使用上手再说

先上图,之后详细分析



matplotlib中的快速绘图的函数库可以通过如下语句载入:

import matplotlib.pyplot as plt


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

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


通过figsize参数可以指定绘图对象的宽度和高度,单位为英寸;dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80。因此本例中所创建的图表窗口的宽度为8*80 = 640像素。

也可以不创建绘图对象直接调用接下来的plot函数直接绘图,matplotlib会自动创建一个绘图对象。

如果需要同时绘制多幅图表的话,可以是给figure传递一个整数参数指定图标的序号,如果所指定序号的绘图对象已经存在的话,将不创建新的对象,而只是让它成为当前绘图对象。

下面的两行程序通过调用plot函数在当前的绘图对象中进行绘图:

plt.plot(x,y,label=”sin(x)sin(x)”,color=”red”,linewidth=2)

plt.plot(x,z,”b–”,label=”cos(x2)cos(x^2)”)

plot函数的调用方式很灵活,第一句将x,y数组传递给plot之后,用关键字参数指定各种属性:

label : 给所绘制的曲线一个名字,此名字在图示(legend)中显示。只要在字符串前后添加”$”符号,matplotlib就会使用其内嵌的latex引擎绘制的数学公式。

color : 指定曲线的颜色

linewidth : 指定曲线的宽度

‘b–’指定曲线的颜色和线型

接下来通过一系列函数设置绘图对象的各个属性:

xlabel / ylabel : 设置X轴/Y轴的文字

title : 设置图表的标题

ylim : 设置Y轴的范围

legend : 显示图示

最后调用plt.show()显示出创建的所有绘图对象。

保存图表

还可以调用plt.savefig()将当前的Figure对象保存成图像文件,图像格式由图像文件的扩展名决定。下面的程序将当前的图表保存为“test.png”,并且通过dpi参数指定图像的分辨率为 120,因此输出图像的宽度为“8X120 = 960”个像素。

plt.savefig("test.png",dpi=120)


实际上不需要调用show()显示图表,可以直接用savefig()将图表保存成图像文件。使用这种方法可以很容易编写出 批量输出图表的程序。

绘制多轴图

一个绘图对象(figure)可以包含多个轴(axis),在Matplotlib中用轴表示一个绘图区域,可以将其理解为子图。上面的第一个例子中,绘图对象只包括一个轴,因此只显示了一个轴(子图(Axes) )。可以使用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()



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

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




当绘图对象中有多个轴的时候,可以通过工具栏中的Configure Subplots按钮,交互式地调节轴之间的间距和轴与边框之间的距离。如果希望在程序中调节的话,可以调用subplots_adjust函数,它有left, right, bottom, top, wspace, hspace等几个关键字参数,这些参数的值都是0到1之间的小数,它们是以绘图区域的宽高为1进行正规化之后的坐标或者长度。

subplot()返回它所创建的Axes对象,可以将它用变量保存起来,然后用sca()交替让它们成为当前Axes对象,并调用plot()在其中绘图。如果需要同时绘制多幅图表,可以给figure()传递一个整数参数指定Figure对象的序号,如果序号所指定的figure对象已经存在,将不创建新的对象,而只是让它成为当前的Figure对象。下面的程序演示了如何依次在不同图表的不同 子图中绘制曲线。

首先通过figure()创建了两个图表,它们的序号分别为1和2。然后在图表2中创建了上下 并排的两个子图,并用变量ax1和ax2保存。

import numpy as np
import matplotlib.pyplot as plt
plt.figure(1) # 创建图表1
plt.figure(2) # 创建图表2
ax1 = plt.subplot(211) # 在图表2中创建子图1
ax2 = plt.subplot(212) # 在图表2中创建子图2

x = np.linspace(0, 3, 100)


在循环中,先调用figure(1)让图表1成为当前图表,并在其中绘图。然后调用sca(ax1) 和sca(ax2)分别让子图ax1和ax2成为当前子图,并在其中绘图。当它们成为当前子图时,包含它们的图表2也自动成为当前图表,因此不需要调用figure(2)依次在图表1和图表2的两 个子图之间切换,逐步在其中添加新的曲线

for i in xrange(5):
plt.figure(1) # 选择图表1
plt.plot(x, np.exp(i*x/3))
plt.sca(ax1) # 选择图表2的子图1
plt.plot(x, np.sin(i*x))
plt.sca(ax2) # 选择图表2的子图2
plt.plot(x, np.cos(i*x))
plt.show()




坐标轴设定

Axis容器包括坐标轴的刻度线、刻度标签、坐标网格以及坐标轴标题等内容。刻度包括主刻度和副刻度,分别通过get_major_ticks()和get_minor_ticks()方法获得。每个刻度线都是一 个XTick或YTick对象,它包括实际的刻度线和刻度标签。为了方便访问刻度线和文本,Axis 对象提供了 get_ticklabels()和get_ticklines()方法,可以直接获得刻度标签和刻度线。

下面例子进行绘图并得到当前子图的X轴对象axis:

未完待续

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: