Zhangxu's Blog.

matplotlib简单上手

Word count: 1,690 / Reading time: 8 min
2018/07/01 Share

本文总结自途索的慕课网课程,增加了些自己的理解。

matplotlib 是一个优秀的数据可视化库,可以很方便的使用Python生成方便我们分析的数据图表,一起来看看吧。

导入必要的包

1
2
import matplotlib.pyplot as plt
import numpy as np

如果是在jupyter中操作,可以使用%matplotlib inline这个魔术方法,它会将matplotlib绘制的图表显示在记事本中,方便直观的浏览。

同时我们还导入了numpy,它是Python语言的一个扩充程序库。支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

准备绘图数据

下面我们用它来生成一些绘图需要的数据:

1
2
x = np.linspace(-np.pi, np.pi, 256)
c, s = np.cos(x), np.sin(x)

linspace方法指定均匀的生成256个从-pi到pi之间的点,返回一个np.array形式的数组。

见名知意,np.cos(x)np.sin(x)是对x做了余弦和正弦的计算,并同样返回数组。

开始画图

有了数据我们开始画图:

1
2
3
4
5
6
7
plt.figure(1)  # 当作是新建一个画布

# 在画布上画两个图形
plt.plot(x, c) # x是横轴,c是纵轴
plt.plot(x, s)

plt.show() # 显示图像

图1

丰富我们的图形

当然,让面只是一个最简单的例子,实际操作时我们需要更多的标注信息,来时我们绘制的图形更易读。

线形、颜色和标题

在我们原来的代码上做些许修改:

1
2
3
4
5
6
7
plt.figure(1)
plt.plot(x, s, color='red', linestyle='-', label='sin') # label 后面绘制图例用
plt.plot(x, c, 'b--', label='cos') # b* 同时表示颜色和线型

plt.title('sin&cos') # 添加title信息

plt.show()

图2

移动坐标轴

看起来好多了, 可是坐标轴在两侧有点别扭,我们把它挪到中间:

1
2
3
4
5
6
7
8
9
10
# 获取轴编辑器
ax = plt.gca()
# 将图像的上边框和右边框隐藏
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 将图像的下边框和左边框设置到数据域的0位置
ax.spines['left'].set_position(('data', 0))
ax.spines['bottom'].set_position(('data', 0))

plt.show()

图3

修改坐标值,添加图例

看起来不错,不过横轴看不出来我们的绘制点和pi有啥关系,我们需要修改下单位信息,同时把图例加上。

1
2
3
4
5
6
7
# 指定五个点,使用laText,编辑公式并显示
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
[r'$-\pi$',r'$-\pi/2$',r'$0$',r'$\pi/2$',r'$\pi$'])
plt.legend(loc='upper left') # 根据label显示的图例相对于画面的位置
plt.grid() # 显示网格线

plt.show()

图4

至此我们画了一个比较可观的图形了,下面是完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-np.pi, np.pi, 256)
c, s = np.cos(x), np.sin(x)

plt.figure(1)
plt.plot(x, s, color='red', linestyle='-', label='sin') # label 后面绘制图例用
plt.plot(x, c, 'b--', label='cos') # b* 同时表示颜色和线型

plt.title('sin&cos') # 添加title信息

# 获取轴编辑器
ax = plt.gca()

# 将图像的上边框和右边框隐藏
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 将图像的下边框和左边框设置到数据域的0位置
ax.spines['left'].set_position(('data', 0))
ax.spines['bottom'].set_position(('data', 0))

# 指定五个点,使用laText,编辑公式并显示
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
[r'$-\pi$',r'$-\pi/2$',r'$0$',r'$\pi/2$',r'$\pi$'])
plt.legend(loc='upper left')
plt.grid()

plt.show()

散点图的绘制

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

fig = plt.figure()

fig.add_subplot(3,3,1) # 将图像分割成三行三列,画在第一个区域中

n = 128
X = np.random.normal(0,1,n) # 生成随机高斯分布,0是均值,1是标准差,生成128个
Y = np.random.normal(0,1,n)

T = np.arctan2(Y, X) # 上色用

plt.scatter(X, Y, s=10, c=T) # s表示点的大小, c是颜色

# 限制轴的范围
plt.axis([-2,2,-2,2]) # [xmin, xmax, ymin, ymax]

plt.xticks([]) # 取消显示轴上的数值
plt.yticks([])

plt.title('scatter')

plt.xlabel('x')
plt.ylabel('y')

plt.show()

图5

柱状图的绘制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 柱状图
fig.add_subplot(332) # 等价于 (3,3,2)

n = 10
X = np.arange(n)

Y1 = (1-X/float(n)) * np.random.uniform(0.5, 1.0, n)
Y2 = (1-X/float(n)) * np.random.uniform(0.5, 1.0, n)

plt.bar(X, +Y1, facecolor='red')
plt.bar(X, -Y2, facecolor='blue')

plt.xticks([]) # 取消显示轴上的数值
plt.yticks([])

# 添加注释
for x, y in zip(X, Y1):
plt.text(x, y, '%.2f' % y, ha='center', va='bottom')

for x, y in zip(X, Y2):
plt.text(x, -y, '%.2f' % -y, ha='center', va='top')

plt.show()

图6

绘制饼图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 饼图
fig.add_subplot(333)

n = 10

Z = np.ones(n)
Z[-1] = 2

plt.pie(Z, colors=['%.2f' % (i/float(n)) for i in range(n)],
labels=['%.2f' % (i/float(n)) for i in range(n)])

plt.gca().set_aspect('equal')

plt.xticks([]) # 取消显示轴上的数值
plt.yticks([])

plt.title('pie')

plt.show()

图7

绘制极坐标图

1
2
3
4
5
6
7
8
9
10
11
12
13
# 极坐标
fig.add_subplot(334, polar=True) # 画图用的是plot, 所以指定polar

n = 20

theta = np.arange(0, 2*np.pi, 2*np.pi/n)
radii = 10*np.random.rand(n)

plt.plot(theta, radii)

plt.title('polar')

plt.show()

图8

热图

1
2
3
4
5
6
7
8
9
10
11
12
# 热图
fig.add_subplot(335)

from matplotlib import cm # 上色用
cmap = cm.Blues

data = np.random.rand(3,3)
plt.imshow(data, cmap=cmap)

plt.title('heatmap')

plt.show()

图9

3D图

1
2
3
4
5
6
7
8
9
10
11
12
from mpl_toolkits.mplot3d import Axes3D  # 引入三维坐标系
fig.add_subplot(336, projection='3d') # 设置三维画布

X = [0,3]
Y = [0,3]
Z = [0,3]

plt.plot(X,Y,Z)

plt.title('3d')

plt.show()

图10

热力图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 热力图
fig.add_subplot(313)

def f(x,y):
return (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - Y**2)

n = 256

x = np.linspace(-3,3,n)
y = np.linspace(-3,3,n)

X, Y = np.meshgrid(x, y)

plt.contourf(X, Y, f(X, Y), cmap=plt.cm.hot)

plt.show()

图11

结语

好啦,至此我们用matplotlib绘制了大多数的图形样式,并且使用了绘制子图的方式,将其绘制在同一个画布中,相信你已经可以根据自己的需求绘制相应的图形了。

最后如果我们想要保存绘制好的图形可以这样操作:

1
plt.savefig('./fig.png')

在项目目录下就会的到保存的图片啦。

CATALOG
  1. 1. 导入必要的包
  2. 2. 准备绘图数据
  3. 3. 开始画图
  4. 4. 丰富我们的图形
    1. 4.1. 线形、颜色和标题
    2. 4.2. 移动坐标轴
    3. 4.3. 修改坐标值,添加图例
  5. 5. 散点图的绘制
  6. 6. 柱状图的绘制
  7. 7. 绘制饼图
  8. 8. 绘制极坐标图
  9. 9. 热图
  10. 10. 3D图
  11. 11. 热力图
  12. 12. 结语