为什么选择Matplotlib
如果某天你发现自己要学习 Matplotlib, 很可能是因为:
Matplotlib 是一个非常强大的 Python 画图工具;
手中有很多数据, 可是不知道该怎么呈现这些数据.
所以就找到了 Matplotlib. 它能帮你画出美丽的:
线图;
散点图;
等高线图;
条形图;
柱状图;
3D 图形,
甚至是图形动画等等.
一、认识matplotlib
Matplotlib是一个Python 2D绘图库,能够以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形,用来绘制各种静态,动态,交互式的图表。
Matplotlib可用于Python脚本,Python和IPython Shell、Jupyter notebook,Web应用程序服务器和各种图形用户界面工具包等。
Matplotlib是Python数据可视化库中的泰斗,它已经成为python中公认的数据可视化工具,我们所熟知的pandas和seaborn的绘图接口其实也是基于matplotlib所作的高级封装。
为了对matplotlib有更好的理解,让我们从一些最基本的概念开始认识它,再逐渐过渡到一些高级技巧中。
二、一个最简单的绘图例子
Matplotlib的图像是画在figure(如windows,jupyter窗体)上的,类似画板;
每一个figure又包含了一个或多个axes(一个可以指定坐标系的子区域),类似画纸;
最简单的创建figure以及axes的方式是通过pyplot.subplots
命令,创建axes以后,可以使用Axes.plot
绘制最简易的折线图。
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]) # 绘制图像
[<matplotlib.lines.Line2D at 0x246d8d2a850>]
和MATLAB命令类似,你还可以通过一种更简单的方式绘制图像,matplotlib.pyplot
方法能够直接在当前axes上绘制图像,如果用户未指定axes,matplotlib会帮你自动创建一个。所以上面的例子也可以简化为以下这一行代码。
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])
[<matplotlib.lines.Line2D at 0x179689f6970>]
axes与subplot的区别
add_axes:生成子图的方式灵活、可以实现add_subplot的绘图效果,且可以控制子图的显示位置
add_subplot画图效果
fig = plt.figure() #指定画板
subplot1 = fig.add_subplot(222)#生成两行两列的子图矩阵,此图在第一个位置
subplot2 = fig.add_subplot(223)
plt.show()
subplot,需要传入3个数字,前两个数字是要生成几行几列的子图矩阵,第三个数字是此子图位于从左上角至右数的第几个位置
add_axes画图效果
fig = plt.figure() #指定画板
axes2 = fig.add_axes([1.1,1.1,1,1])
axes1 = fig.add_axes([0,0,1,1])
plt.show()
fig = plt.figure() #指定画板
axes1 = fig.add_axes([0,0,1,1])
axes2 = fig.add_axes([0.1,0.1,0.1,0.1])
plt.show()
##此时必须先画大的画纸,否则画不出想要的效果
Axes(轴域):Axis的集合,需要输入4个数字,前两个数字是原点的坐标(从左下角开始),后两个数字是坐标轴的长度
三、Figure的组成
现在我们来深入看一下figure的组成。通过一张figure解剖图,我们可以看到一个完整的matplotlib图像通常会包括以下四个层级,这些层级也被称为容器(container),下一节会详细介绍。在matplotlib的世界中,我们将通过各种命令方法来操纵图像中的每一个部分,从而达到数据可视化的最终效果,一副完整的图像实际上是各类子元素的集合。
-
Figure
:顶层级,用来容纳所有绘图元素 -
Axes
:matplotlib宇宙的核心,容纳了大量元素用来构造一幅幅子图,一个figure可以由一个或多个子图组成 -
Axis
:axes的下属层级,用于处理所有和坐标轴,网格有关的元素 -
Tick
:axis的下属层级,用来处理所有和刻度有关的元素
四、两种绘图接口
matplotlib提供了两种最常用的绘图接口
-
显式创建figure和axes,在上面调用绘图方法,也被称为OO模式(object-oriented style)
-
依赖pyplot自动创建figure和axes,并绘图
使用第一种绘图接口,是这样的:
x = np.linspace(0, 2, 100)#numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 产生从start到stop的等差数列,num为元素个数,默认50个
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()
<matplotlib.legend.Legend at 0x1796bd0e640>
而如果采用第二种绘图接口,绘制同样的图,代码是这样的:
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()
<matplotlib.legend.Legend at 0x29937137e48>