NumPy和Matplotlib绘图

Matplotlib 是 Python 的绘图库,它经常与 NumPy 一起使用,从而提供一种能够代替 Matlab 的方案。不仅如此 Matplotlib 还可以与 PyQt 和 wxPython 等图形工具包一起使用。

绘制线性函数图像

Matplotlib 的子模块模块 pyplot 是用来绘制 2D 图像的重要模块。

绘制了函数 y = 2x + 5 的图像:

1
2
3
4
5
6
7
8
9
10
11
import numpy as np
from matplotlib import pyplot as plt
x = np.arange(1,11)
y = 2 * x + 5
#绘制坐标标题
plt.title("Matplotlib demo")
#绘制x、y轴备注
plt.xlabel("x axis")
plt.ylabel("y axis")
plt.plot(x,y)
plt.show()

您可以向 plot() 函数中添加格式化字符,来实现不同样式的显示或标记。

常用的格式化字符:

‘-‘
实线样式

‘–’
短横线样式

‘-.’
点划线样式

‘:’
虚线样式

‘.’
点标记

‘,’
像素标记

‘o’
圆标记

‘v’
倒三角标记

‘^’
正三角标记

‘<’
左三角标记

‘>’
右三角标记

‘1’
下箭头标记

‘2’
上箭头标记

‘3’
左箭头标记

‘4’
右箭头标记

‘s’
正方形标记

‘p’
五边形标记

‘*’
星形标记

‘h’
六边形标记 1

‘H’
六边形标记 2

‘+’
加号标记

‘x’
X 标记

‘D’
菱形标记

‘d’
窄菱形标记

‘|’
竖直线标记

‘_’
水平线标记

同时 Matplotlib 还定义了一些颜色字符

‘b’
蓝色

‘g’
绿色

‘r’
红色

‘c’
青色

‘m’
品红色

‘y’
黄色

‘k’
黑色

‘w’
白色

如果想要以圆点的样式,来代替图 1 中的线条样式,那么可以使用“ ob”作为 plot() 的格式化字符。如下所示:

1
2
3
4
5
6
7
8
9
import numpy as np
from matplotlib import pyplot as plt
x = np.arange(1,11)
y = 2 * x + 5
plt.title("Matplotlib demo1")
plt.xlabel("x axis")
plt.ylabel("y axis")
plt.plot(x,y,"ob")
plt.show()

绘制正弦波图

1
2
3
4
5
6
7
8
9
import numpy as np
import matplotlib.pyplot as plt
# 计算正弦曲线上的x和y坐标
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)
plt.title("sine wave image")
# 使用matplotlib制图
plt.plot(x, y)
plt.show()

subplot()
subplot() 允许您在同一画布中的不同位置绘制多个图像,可以理解为对画布按行、列分割

函数的语法格式:

plt.subplot(nrows, ncols, index, **kwargs)

该函数使用三个整数描述子图的位置信息,这三个整数是行数、列数和索引值(此处索引值从1开始),子图将分布在设定的索引位置上。

从右上角增加到右下角。
plt.subplot(2, 3, 5) 表示子图位于 2 行 3 列 中的第 5 个位置上。

下面示例是在同一画布中绘制正弦和余弦图像:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np
import matplotlib.pyplot as plt

#计算正弦和余弦曲线上的点的 x 和 y 坐标
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)

#绘制subplot 网格为2行1列
#激活第一个 subplot
plt.subplot(2, 1, 1)
#绘制第一个图像
plt.plot(x, y_sin)
plt.title('Sine')

#将第二个 subplot 激活,并绘制第二个图像
plt.subplot(2, 1, 2)
plt.plot(x, y_cos)
plt.title('Cosine')
#展示图像
plt.show()

bar()柱状图

pyplot 子模块中提供了 bar() 函数来生成柱状图。

下面示例代码,生成了两组数据的柱状图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from matplotlib import pyplot as plt
#第一组数据
x1 = [5,8,10]
y1 = [12,16,6]
#第二组数据
x2 = [6,9,11]
y2 = [6,15,7]
plt.bar(x1, y1, align = 'center')
plt.bar(x2, y2, color = 'g', align = 'center')
plt.title('Bar graph')
#设置x轴与y轴刻度
plt.ylabel('Y axis')
plt.xlabel('X axis')
plt.show()

numpy.histogram()

直方图是一种表示数据概率分布的常用图形。

NumPy 提供了 histogram() 函数,它以直方图的形式表示一组数据的概率分布值。histogram() 函数有两个返回值,分别是 hist 与 bin_edges,分别代表直方图高度值与 bin 数值区间范围,

函数的语法格式如下:
histogram(array,bins=10,range=None,weights=None,density=False)

1
2
3
import numpy as np 
a = np.arange(8)
hist, bin_edges = np.histogram(a, density=True)

numpy.histogram() 将输入数组 a 和 bins 作为两个参数,其中 bins 数组的连续元素作为 bin 区间的边界值

1
2
3
4
5
6
import numpy as np
a = np.array([22,87,5,43,56,73,55,54,11,20,51,5,79,31,27])
np.histogram(a,bins = [0,20,40,60,80,100])
hist,bins = np.histogram(a,bins = [0,20,40,60,80,100])
print(hist)
print(bins)

plt()
pyplot 子模块的 plt() 函数将一个输入数组和 bins 数组作为参数,并将其输出为直方图。

1
2
3
4
5
6
from matplotlib import pyplot as plt
import numpy as np
a = np.array([22,87,5,43,56,73,55,54,11,20,51,5,79,31,27])
plt.hist(a, bins = [0,20,40,60,80,100])
plt.title("histogram")
plt.show()

NumPy IO操作

NumPy IO 操作是以文件的形式从磁盘中加载 ndarray 对象。在这个过程中,NumPy 可以两种文件类型处理 ndarray 对象,一类是二进制文件(以.npy结尾),另一类是普通文本文件。

我们知道,文件会被保存在不同的计算机上(比如 Linux、Windows、MacOSX 等)。为了不受的计算机架构影响,NumPy 开发团队给 ndarray 对象引入了一种.npy文件格式,通过它来件实现对 ndarray 对象的保存。

numpy.save() 方法将输入数组存储在.npy文件中。

numpy.save(file, arr, allow_pickle=True, fix_imports=True)

file:保存后的文件名称,其文件类型为.npy;

arr:要保存的数组

allow_pickle:可选项,布尔值参数,允许使用 pickle 序列化保存数组对象

fix_imports:可选项,为了便于在 Pyhton2 版本中读取 Python3 保存的数据

1
2
3
import numpy as np
a = np.array([1,2,3,4,5])
np.save('first',a)

使用 load() 从 first.npy 文件中加载数据

1
2
3
import numpy as np
b = np.load('outfile.npy')
print( b)

savetxt()

savetxt() 和 loadtxt() 分别表示以文本格式存储数据或加载数据。

savetxt() 语法格式:
np.savetxt(‘filename文件路径’, self.task, fmt=”%d”, delimiter=” “)

filename:表示保存文件的路径
self.task: 要保存数组的变量名
fmt=”%d”: 指定保存文件的格式,默认是十进制
delimiter=” “表示分隔符,默认以空格的形式隔开

1
2
3
4
5
6
import numpy as np
a = np.array([1,2,3,4,5])
np.savetxt('second.txt',a)
#使用loadtxt重载数据
b = np.loadtxt('second.txt')
print(b)