matplotlib绘图基础--笔记

matplotlib 是python可视化著名的2D绘图库,类似于matlab的绘图工具。在其官网中也提供了非常多的例子,照猫画虎基本能完成所需的作图。本文主要介绍下matplotlib作图的一些基础知识。

利用matplotlib库作图,在程序中先要引入pyplot作图模块:

import matplotlib.pyplot as plt

结合例子作介绍:
例子1.

# -*- 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)
# use attribute figure to create a figure object
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.savefig('fig1.png')
plt.show()

matplotlib绘图基础--笔记_第1张图片
这里plt.figure(figsize=(8, 4)) 创建了一个绘图对象,图片尺寸长8英寸,宽4英寸,dpi可以指定每英寸多少像素,默认80.
plot函数的调用,将x,y数组传递给plot,用关键字参数指定曲线的各种属性
绘图对象的其他属性(坐标轴等)的设置:
- xlabel:设置x轴的标注
- ylabel:设置y轴的标注
- title: 设置图表的标题
- xlim,ylim:设置x,y轴的坐标范围
- legend:显示曲线标注
最后用plt.savefig(name)plt.show() 保存、显示创建的所有绘图对象。


1. 配置属性

matplotlib所绘制的每个组成部分都有对应一个对象,我们可以通过调用这些对象的属性设置方法set_* 或者pyplot的属性设置函数setp设置其属性值。例如plot函数返回一个matplotlib.lines.Line2D对象的列表,下面的例子显示如何设置Line2D对象的属性:

In [1]: import numpy as np

In [2]: import matplotlib.pyplot as plt

In [3]: x = np.arange(0, 5, 0.1)

In [4]: line, = plt.plot(x, x*x)

In [5]: line
Out[5]: 0x7fce780c74e0>

In [6]: lines = plt.plot(x, x*x)

In [7]: lines
Out[7]: [0x7fce780e2588>]

plot函数返回的是一个列表,lines说明了这一点;通过line, = plt.plot(x, x*x) 获取的是这个列表中的第一个元素。

In [8]: line.set_antialiased(False)

In [9]: lines = plt.plot(x, np.sin(x),  x, np.cos(x))

In [10]: lines
Out[10]: 
[0x7fce7808b518>,
 0x7fce7808bd30>]

In [11]: plt.setp(lines, color='r', lw=2)

调用Line2D对象line的set_antialiased方法,关闭对象的反锯齿效果。或者通过调用plt.setp函数配置多个Line2D对象的颜色和先款属性。同样可以通过调用Line2D对象的get_*, 或者plt.getp函数获取对象的属性。
matplotlib的整个图表为一个Figure对象,此对象在调用plt.figure函数时返回,也可以通过plt.gcf函数获取当前的绘图对象。

f =plt.gcf()

2. 绘制多轴图

一个绘图对象(figure)可以包含多个轴(axis),在matplotlib中用轴表示一个绘图区域,可以将其理解为子图。上面的例子1中,绘图对象只包含一个轴,因此只显示了一个轴(子图)。我们可以用subplot函数快速绘制多个轴的图表。

subplot(numRows, numCols, plotNum)

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

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

matplotlib绘图基础--笔记_第2张图片

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

plt.subplot(221) # 分成2*2,画在第一
plt.subplot(222) # 分成2*2,画在第二
plt.subplot(212) # 分成2*1,画在第二
plt.show()

matplotlib绘图基础--笔记_第3张图片

当绘图对象中有多个轴的时候,可以调用subplots_adjust 函数,它有left, right, bottom, top, wspace, hspace等几个关键字参数,值都是0,1之间的小数,它们是以绘图区域的宽高为1进行正规化之后的坐标或者长度:

f = plt.gcf()
f.subplots_adjust(hspace=0.3, wspace=0.5)
plt.show()

matplotlib绘图基础--笔记_第4张图片


3. Artist 对象

matplotlib API包含三层:
- backend_bases.FigureCanvas: 图表的绘制领域
- backend_bases.Renderer: 知道如何在FigureCanvas上绘图
- artist.Artist: 知道如何使用Renderer在FigureCanvas上绘图

FigureCanvas和Renderer需要处理底层的绘图操作,例如使用wxPython在界面上绘图,或者使用PostScript绘制PDF。Artist则处理所有的高层结构,例如处理图表、文字和曲线等的绘制和布局。通常我们只和Artist打交道,而不需要关心底层的绘制细节。

Artists分为简单类型和容器类型两种。简单类型的Artists为标准的绘图元件,例如Line2D、 Rectangle、 Text、AxesImage 等等。而容器类型则可以包含许多简单类型的Artists,使它们组织成一个整体,例如Axis、 Axes、Figure等。

直接使用Artists创建图表的标准流程:
- 创建Figure对象
- 用Figure对象创建一个或多个Axes或Subplot对象
- 调用Axes等对象的方法创建各种简单类型的Artists

下面首先调用pyplot.figure辅助函数创建Figure对象,然后调用Figure对象的add_axes方法在其中创建一个Axes对象,add_axes的参数是一个形如[left, bottom, width, height]的列表,这些数值分别指定所创建的Axes对象相对于fig的位置和大小,取值范围都在0到1之间:

fig = plt.figure()
ax = fig.add_axes([0.15, 0.1, 0.7, 0.3])

然后我们调用ax的plot方法绘图,创建一条曲线,并且返回此曲线对象(Line2D)。

In [32]: line, = ax.plot([1,2,3],[1,2,1])

In [33]: ax.lines
Out[33]: [0x7fce6e145470>]

In [34]: line
Out[34]: 0x7fce6e145470>

ax.lines是一个为包含ax的所有曲线的列表,后续的ax.plot调用会往此列表中添加新的曲线。如果想删除某条曲线的话,直接从此列表中删除即可。

Axes对象还包括许多其它的Artists对象,例如我们可以通过调用set_xlabel设置其X轴上的标题:

ax.set_xlabel("time")

4. Artist的属性

图表中的每个元素都用一个matplotlib的Artist对象表示,而每个Artist对象都有一大堆属性控制其显示效果。例如Figure对象和Axes对象都有patch属性作为其背景,它的值是一个Rectangle对象。通过设置此它的一些属性可以修改Figrue图表的背景颜色或者透明度等属性,下面的例子将图表的背景颜色设置为绿色:

fig = plt.figure()
fig.show()
fig.patch.set_color("g")
fig.canvas.draw()

patch的color属性通过set_color函数进行设置,属性修改之后并不会立即反映到图表的显示上,还需要调用fig.canvas.draw()函数才能够更新显示。

下面是Artist对象都具有的一些属性:
- alpha : 透明度,值在0到1之间,0为完全透明,1为完全不透明
- animated: 布尔值,在绘制动画效果时使用
- axes: 此Artist对象所在的Axes对象,可能为None
- clip_box: 对象的裁剪框
- clip_on: 是否裁剪
- clip_path: 裁剪的路径
- contains: 判断指定点是否在对象上的函数
- figure: 所在的Figure对象,可能为None
- label: 文本标签
- picker: 制Artist对象选取
- transform: 控制偏移旋转
- visible: 是否可见
- zorder: 控制绘图顺序

Artist对象的所有属性都通过相应的 get_* set_* 函数进行读写。
如果你想用一条语句设置多个属性的话,可以使用set函数:

fig.set(alpha=0.5, zorder=2)

5. Figure容器

现在我们知道如何观察和修改已知的某个Artist对象的属性,接下来要解决如何找到指定的Artist对象。前面我们介绍过Artist对象有容器类型和简单类型两种,这一节让我们来详细看看容器类型的内容。

最大的Artist容器是matplotlib.figure.Figure,它包括组成图表的所有元素。图表的背景是一个Rectangle对象,用Figure.patch属性表示。当你通过调用add_subplot或者add_axes方法往图表中添加轴(子图时),这些子图都将添加到Figure.axes属性中,同时这两个方法也返回添加进axes属性的对象,注意返回值的类型有所不同,实际上AxesSubplot是Axes的子类。

In [38]: fig = plt.figure()
    ...: ax1 = fig.add_subplot(211)
    ...: ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.3])
    ...: 

In [39]: ax1
Out[39]: 0x7fce6dee7358>

In [40]: ax2
Out[40]: 0x7fce6e94f828>

不建议直接对Figure.axes属性进行列表操作,而应该使用add_subplot, add_axes, delaxes等方法进行添加和删除操作。

Figure对象有如下属性包含其它的Artist对象:

  • axes : Axes对象列表
  • patch : 作为背景的Rectangle对象
  • images : FigureImage对象列表,用来显示图片
  • legends : Legend对象列表
  • lines : Line2D对象列表
  • patches : patch对象列表
  • texts : Text对象列表,用来显示文字

6. Axes容器

Axes容器是整个matplotlib库的核心,它包含了组成图表的众多Artist对象,并且有许多方法函数帮助我们创建、修改这些对象。和Figure一样,它有一个patch属性作为背景,当它是笛卡尔坐标时,patch属性是一个Rectangle对象,而当它是极坐标时,patch属性则是Circle对象。例如下面的语句设置Axes对象的背景颜色为绿色:

fig = plt.figure()
ax = fig.add_subplot(111)
ax.patch.set_facecolor("green")

当你调用Axes的绘图方法(例如plot),它将创建一组Line2D对象,并将所有的关键字参数传递给这些Line2D对象,并将它们添加进Axes.lines属性中,最后返回所创建的Line2D对象列表:

>>> x, y = np.random.rand(2, 100)
>>> line, = ax.plot(x, y, "-", color="blue", linewidth=2)
>>> line
0x03007030>
>>> ax.lines
[0x03007030>]

注意plot返回的是一个Line2D对象的列表,因为我们可以传递多组X,Y轴的数据,一次绘制多条曲线。

与plot方法类似,绘制直方图的方法bar和绘制柱状统计图的方法hist将创建一个Patch对象的列表,每个元素实际上都是Patch的子类Rectangle,并且将所创建的Patch对象都添加进Axes.patches属性中

下面详细列出Axes包含各种Artist对象的属性:

  • artists : Artist对象列表
  • patch : 作为Axes背景的Patch对象,可以是Rectangle或者Circle
  • collections : Collection对象列表
  • images : AxesImage对象列表
  • legends : Legend对象列表
  • lines : Line2D对象列表
  • patches : Patch对象列表
  • texts : Text对象列表
  • xaxis : XAxis对象
  • yaxis : YAxis对象

下面列出Axes的创建Artist对象的方法:

Axes的方法 所创建的对象 添加进的列表
annotate Annotate texts
bars Rectangle patches
errorbar Line2D, Rectangle lines,patches
fill Polygon patches
hist Rectangle patches
imshow AxesImage images
legend Legend legends
plot Line2D lines
scatter PolygonCollection Collections
text Text texts

下面以绘制散列图(scatter)为例,验证一下:

>>> fig = plt.figure()
>>> ax = fig.add_subplot(111)
>>> t = ax.scatter(np.random.rand(20), np.random.rand(20))
>>> t # 返回值为CircleCollection对象
0x06004230>
>>> ax.collections # 返回的对象已经添加进了collections列表中
[0x06004230>]
>>> fig.show()
>>> t.get_sizes() # 获得Collection的点数
20

matplotlib绘图基础--笔记_第5张图片


7. Axis容器

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

原始网站:
matplotlib-绘制精美图表

你可能感兴趣的:(python)