第一回:Matplotlib初相识
一、认识matplotlib
Matplotlib是受MATLAB的启发构建的。MATLAB是数据绘图领域广泛使用的语言和工具。MATLAB语言是面向过程的。利用函数的调用,MATLAB中可以轻松的利用一行命令来绘制直线,然后再用一系列的函数调整结果。
Matplotlib有一套完全仿照MATLAB的函数形式的绘图接口,在Matplotlib.pyplot模块中。这套函数接口方便MATLAB用户过度到Matplotlib包
Matplotlib是一个Python 2D绘图库,能够以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形,用来绘制各种静态,动态,交互式的图表。
Matplotlib可用于Python脚本,Python和IPython Shell、Jupyter notebook,Web应用程序服务器和各种图形用户界面工具包等。
Matplotlib是Python数据可视化库中的泰斗,它已经成为python中公认的数据可视化工具,我们所熟知的pandas和seaborn的绘图接口其实也是基于matplotlib所作的高级封装。
为了对matplotlib有更好的理解,让我们从一些最基本的概念开始认识它,再逐渐过渡到一些高级技巧中。
二、一个简单的绘图例子
2.1 自己创建axe
import matplotlib.pyplot as plt
import numpy as np
fig , ax = plt.subplots() #创建一个包含一个axes的figure
ax.plot([1,2,3,4],[1,4,2,3]) #绘制折线图
2.2 自动创建
plt.plot([1,2,3,4],[1,4,2,3])
三、Figure的组成
一个完整的matplotlib图像通常会包括以下四个层级。
- Figure:顶级层,用来容纳所有绘图元素,理解为画布
- Axes:matplotlib宇宙的核心,容纳了大量元素来构造一幅幅子图,一个figure可以由一个或多个子图组成
- Axis:axes的下属层级,用于处理所有和坐标轴,网格有关的元素
- Tick:axis的下属层级,用于处理所有和刻度有关的元素
四、两种绘图接口
matplotlib提供了两种最常用的绘图接口
- 显示创建fig和axes,在上面调用绘图方法,也被称为OO模式(objected-oriented style)
- 依赖pyplot自动创建figure和axes
第一种:
x = np.linspace(0 , 2, 100)
fig , ax = plt.subplots()
ax.plot(x,x,label='linear')
ax.plot(x,x**2,label='quadratic')
ax.plot(x,x**3,label='cubic')
ax.set_xlabel('x label')
ax.set_ylabel('y label')
ax.set_title('Simple Plot')
ax.legend()
plt.subplots()
fig,ax = plt.subplots(1,3)
#其中参数1和3分别代表子图的行数和列数,一共有 1x3 个子图像。函数返回一个figure图像和子图ax的array列表。
fig,ax = plt.subplots(1,3,1)#最后一个参数1代表第一个子图
#如果想要设置子图的宽度和高度可以在函数内加入figsize值
fig, ax = plt.subplots(1,3,figsize=(15,7)),这样就会有1行3个15x7大小的子图
x = np.linspace(0, 2, 100)
plt.plot(x, x, label='linear')
plt.plot(x, x**2, label='quadratic')
plt.plot(x, x**3, label='cubic')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend()
# sharex,sharey 在所有子图中共享x轴或y轴
x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)
f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax1.plot(x, y)
ax1.set_title('Sharing Y axis')
ax2.scatter(x, y)
ax1.set_xlabel('x axis')
ax1.set_ylabel('y axis')
ax2.set_xlabel('x axis')
ax2.set_ylabel('y axis')
五、思考
axes方法和pyplot方法
5.1subplots方法
subplots方法可以一次性绘制几个子图
import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(2, 2)
ax1 = axes[0, 0]
ax2 = axes[0, 1]
ax3 = axes[1, 0]
ax4 = axes[1, 1]
ax2.plot(np.arange(4))
plt.scatter(np.arange(4), np.arange(4))
plt.show()
通过subplots方法得到画布fig和一个包含所有字坐标轴的数组axes。使用切片方法能够获得里面的每个子坐标轴。接下来调用相应坐标轴的plot方法,在ax2坐标轴绘制了直线图;如果直接使用 plt.scatter ,我们会发现在最后一个子图中绘制了散点图,这就是区别,plt方法默认是在最后一个建立的坐标轴上绘图。得到如下图形:
5.2 subplot方法
通过subplot方法逐一添加子坐标轴并完成绘图
ax1 = plt.subplot(2, 2, 1)
ax2 = plt.subplot(2, 2, 2)
plt.plot(np.arange(4))
ax3 = plt.subplot(2, 2, 3)
plt.scatter(np.arange(4), np.arange(4))
ax4 = plt.subplot(2, 2, 4)
plt.show()
这种添加子坐标轴的方式,就跟plt方法的顺序有关系了,默认plt在对应的子坐标轴下完成绘图。得到如下图形:
在plt的很多方法中都有ax参数,它可以用来指定在某个具体的坐标轴上绘图。比如
plt.colorbar(ax=ax1)
5.3 总结
本文再次介绍了axes和pyplot方法的使用,具体跟调用的绘图方法有关:subplots方法最好使用axes方法绘图,它是先搭框架再绘图;而subplot方法则是通过代码块一步步绘图,逻辑非常清晰,并且在代码块中可以使用plt方法。