0%

python matplotlib 库学习笔记

python 大法好,学习python 受益终身。

最近图像处理要用到 python matplotlib 库,有用到的话,都在这里记录。 官方样例地址: http://matplotlib.org/gallery.html

python matplotlib 绘图基本步骤

先看看如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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()

 

1.载入matplotlib的绘图模块pyplot,并重命名为plt

1
import matplotlib.pyplot as plt

 

2. 调用figure()创建一个Figure(图表)对象

还可以设置DPI(即每英寸所表示的像素数),缺省值为80。因此本例中所创建的Figure对象的宽度为“8*80 = 640”个像素。

3.调用plot()在当前的Figure对象中绘图

参数说明:

  1. X:X轴数据
  2. Y:Y轴数据
  3. 指定曲线的颜色和线性,如'b-'表示,蓝色虚线(b:蓝色,-虚线)
  4. 使用关键字参数可以指定所绘制的曲线的各种属性:
  • label:给曲线指定一个标签名称,此标签将在图示中显示。如果标签字符串的前后有字符’$’,则matplotlib会使用其内嵌的LaTex引擎将其显示为数学公式。

  • color:指定曲线的颜色。颜色可以用如下方法表示

    • 英文单词
    • 以’#’字符开头的三个16进制数,如’#ff0000’表示红色。
    • 0~1的RGB表示,如(1.0, 0.0, 0.0)也表示红色。
  • linewidth:指定曲线的宽度,可以不是整数,也可以使用缩写形式的参数名lw。 当然,它也可以同时画两个曲线,如下图,同时画出正弦和余弦曲线:

1
2
x=np.arange(0,5,0.1)
plt.plot(x, np.sin(x), x, np.cos(x))

 

4.通过一系列函数设置当前Axes对象的各个属性:

  • xlabel、ylabel:分别设置X、Y轴的标题文字。
  • title:设置子图的标题。
  • xlim、ylim:分别设置X、Y轴的显示范围。
  • legend:显示图示,即图中表示每条曲线的标签(label)和样式的矩形区域。

5.调用plt.show()显示出绘图窗口

在通常的运行情况下,show()将会阻塞程序的运行,直到用户关闭绘图窗口。

保存图像

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

 

采用面向对象方法进行绘图

pyplot模块虽然用法简单,但不适合在较大的应用程序中使用。 当前的图表和子图可以使用gcf()和gca()获得

1
2
3
fig = plt.gcf()
axes = plt.gca()
print fig,axes

output:

1
Figure(640x480) Axes(0.125,0.1;0.775x0.8)

plot()实际上会通过gca()获得当前的Axes对象ax,然后再调用它的plot()方法实现真正的绘图。

1
2
3
4
5
6
7
8
def plot(*args, **kwargs):
ax = gca()
...
try:
ret = ax.plot(*args, **kwargs)
...
finally:
ax.hold(washold)

 

配置属性

plot()返回一个元素类型为Line2D的列表 下面的代码中,对x^3的数组取消了抗锯齿效果。

1
2
3
4
x = np.arange(0, 5, 0.1)
line = plt.plot(x, x*x,x,x**3)[1]
line.set_antialiased(False)
plt.show()

 

调用setp()可以同时配置多个对象的属性,这里我们同时设置两条曲线的颜色和线宽:

1
2
3
4
x = np.arange(0, 5, 0.1)
line = plt.plot(x, x*x,x,x**3)
plt.setp(line, color="r", linewidth=2.0)
plt.show()

 

绘制多子图

一个Figure对象可以包含多个子图(Axes) 我们可以使用subplot()快速绘制包含多个子图的图表,它的调用形式如下:

1
subplot(numRows, numCols, plotNum)#行,列,区域号
  • 图表的整个绘图区域被等分为numRows行和numCols列,然后按照从左到右、从上到下的顺序对每个区域进行编号,左上区域的编号为1。
  • 如果新创建的子图和之前创建的子图区域有重叠的部分,则之前的子图将被删除。
  • numRows、numCols和plotNum三个参数都小于10,则可以把它们缩写成一个整数,例如subplot(323)和subplot(3,2,3)的含义相同
  • subplot()返回它所创建的Axes对象
1
2
3
for idx, color in enumerate("rgbyck"):
plt.subplot(321+idx, axisbg=color)
plt.show()

如果希望某个子图占据整行或者整列,可以如下调用subplot():

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

sca()交替不同图/子图它们成为当前Axes对象,并调用plot()在其中绘图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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)
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()

 

在图表中显示中文

matplotlib的缺省配置文件中所使用的字体无法正确显示中文。为了让图表能正确显示中文,可以有几种解决方案。

  • 在程序中直接指定字体。
  • 在程序开头修改配置字典rcParams。
  • 修改配置文件。

下面是通过修改字体实现的。其实我也比较喜欢这个

1
2
3
4
5
6
7
8
9
10
11
from matplotlib.font_manager import FontProperties
import matplotlib.pyplot as plt
import numpy as np
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
t = np.linspace(0, 10, 1000)
y = np.sin(t)
plt.plot(t, y)
plt.xlabel(u"时间", fontproperties=font)
plt.ylabel(u"振幅", fontproperties=font)
plt.title(u"正弦波", fontproperties=font)
plt.show()

 

其他

在图表中输出图像:plt.imshow(img)

柱状图

原地址http://matplotlib.org/examples/statistics/histogram_demo_features.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# -*- coding:utf-8 -*-
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

x = [5,6,7,8,5,6,5] #数据
num_bins = 5 #列数
# the histogram of the data
bins= plt.hist(x, num_bins, normed=1, facecolor='green', alpha=0.5)

plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title(r'Histogram')

# Tweak spacing to prevent clipping of ylabel
plt.subplots_adjust(left=0.15)
plt.show()
请我喝杯咖啡吧~