第一回:Matplotlib初相识
一、认识Matplotlib
Matplotlib是一个Python2D绘图库,能够以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形,用来绘制各种静态、动态、交互式的图表
可用于Python脚本,Python和IPython Shell、Jupyter notebook,Web应用程序服务器和各种图形用户界面工具包等。
二、一个最简单的绘图例子
Matplotlib的图像是画在figure(如Windows、jupyter窗体)上的,每一个figure又包含了一个或多个axes(一个可以指定坐标系的子区域)。最简单的创建figure以及axes的方式是通过pyplot.subplots命令,创建axes以后,可以使用Axes.plot回执最简易的折线图。
import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np fig, ax = plt.subplots() #创建一个包含一个axes的figure ax.plot([1, 2, 3, 4], [1, 4, 2, 3]) #绘制图像 plt.show()
Tick:在jupyter notebook中使用Matplotlib时会发现代码运行后会自动打印出类似<matplotlib.lines.line2p at 0x23155916dco>这样一段话。
这是因为matplotlib的绘图默认打印出最后一个对象。解决方法:
1> 在代码块最后加入一个分号
2> 在代码块最后加一句plt.show()
3> 在绘图时将绘图对象显式赋值给一个变量如将plt.plot([1,2,3,4])改成line=plt.plot([1,2,3,4])
运行:
三、Figure的组成
一个完整的Matplotlib图像通常会包括四个层级,也称容器。
Figure:顶层级,用来容纳所有绘图元素
Axes:Matplotlib宇宙的核心。容纳了大量元素用来构造一幅子图,一个Figure可以由一个或多个子图组成
Axis:axis的下属层级,用来处理所有和坐标轴。网格有关的元素
Tick:axis的下属层级,用来处理所有和刻度有关的元素
四、两种绘图接口
1.显式创建figure和axes
在上面调用绘图方法,也被称为OO模式(object-oriented style)
import matplotlib.pyplot as plt import numpy as np 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.show()
2.依赖pyplot自动创建figure和axes
import matplotlib.pyplot as plt import numpy as np 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() plt.show()
五、通用绘图模板
任何复杂的图表几乎都可以基于这个模板骨架填充内容而成
#step1
x = np.linspace(0,2,100)
y = x ** 2
#step2 设置绘图样式,这一模块的扩展参考第五章进一步学习,这一步不是必须的,样式也可以在绘制图像时进行设置
mpl.rc('line',linewidth = 4,linestyle = '-.')
#step3 定义布局,这一模块的扩展参考第三章进一步学习
fig,ax = plt.subplots()
#step4 绘制图像,这一模块的扩展参考第二章进一步学习
ax.plot(x,y,label = 'linear')
#step5 添加标签、文字、和图例,这一模块的扩展参考第四章进一步学习
ax.set_xlabel('x label')
ax.set_ylabel('y label')
ax.set_title("Simple Plot)
ax.legend()
plt.show()