【课程介绍】?
Datawhale开源教程链接:?https://github.com/datawhalechina/fantastic-matplotlib?
本项目重点在两个层面帮助读者构建matplotlib的知识体系:
- 从图形,布局,文本,样式等多维度系统梳理matplotlib的绘图方法,构建对于绘图方法的整体理解。
- 从绘图API层级,接口等方面阐明matplotlib的设计理念,摆脱只会复制粘贴的尴尬处境。
目录?
一、认识matplotlib
二、一个最简单的绘图例子
三、Figure的组成
四、两种绘图接口
五、通用绘图模板
思考题
一、认识matplotlib
【教程】Matplotlib是一个Python 2D绘图库,能够以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形,用来绘制各种静态,动态,交互式的图表。
Matplotlib可用于Python脚本,Python和IPython Shell、Jupyter notebook,Web应用程序服务器和各种图形用户界面工具包等。
Matplotlib是Python数据可视化库中的泰斗,它已经成为python中公认的数据可视化工具,我们所熟知的pandas和seaborn的绘图接口其实也是基于matplotlib所作的高级封装。
为了对matplotlib有更好的理解,让我们从一些最基本的概念开始认识它,再逐渐过渡到一些高级技巧中。
【拓展】
Matplotlib是Python的拓展库,所以继承了Python语法的优点,面向对象、易读、易维护、代码简洁优美。Matplotlib依托于Python,可借助Python的强大丰富的拓展模块嵌入在图形用户界面应用程序中,也可嵌入在网页中。
python和Matlab区别:
Python相比于Matlab的最大优势是:Python是一门通用编程语言,实现科学计算功能的numpy、scipy、matplotlib只是Python的库和Package而已,除此之外Python还有用于各种用途的库和包,比如用于GUI的PyQt和wxPython,用于Web的Django和Flask。
Matlab相比于Python最大的优势是:它专门就是给数值计算开发的,在数值计算这个领域库最多、用的人最多、出的书最多。
二、一个最简单的绘图例子
先导包:
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
在网页界面显示图像必备:
%matplotlib inline
(拓展)风格自定义:
plt.style.use('ggplot')
最简单的创建figure以及axes的方式是通过`pyplot.subplots`命令,创建axes以后,可以使用`Axes.plot`绘制最简易的折线图:
fig, ax = plt.subplots() # 创建一个包含一个axes的figure
ax.plot([1, 2, 3, 4], [1, 4, 2, 3]); # 绘制图像
【Trick】 在jupyter notebook中使用matplotlib时如果不想显示这句话`<matplotlib.lines.Line2D at 0x23155916dc0>`,有以下三种方法:
1. 在代码块最后加一个分号`;`(如例子) 2. 在代码块最后加一句plt.show() 3. 在绘图时将绘图对象显式赋值给一个变量,如将plt.plot([1, 2, 3, 4]) 改成line =plt.plot([1, 2, 3, 4])?
和MATLAB命令类似,你还可以通过一种更简单的方式绘制图像,`matplotlib.pyplot`方法能够直接在当前axes上绘制图像,如果用户未指定axes,matplotlib会帮你自动创建一个。所以上面的例子也可以简化为以下这一行代码。
line =plt.plot([1, 2, 3, 4], [1, 4, 2, 3])?
实现: ?
重点:figure和axes,前者为所有绘图操作定义了顶层类对象Figure,相当于是提供了画板;而后者则定义了画板中的每一个绘图对象Axes,相当于画板内的各个子图。
通过一张figure解剖图,我们可以看到一个完整的matplotlib图像通常会包括以下四个层级,这些层级也被称为容器(container)。
- `Figure`:顶层级,用来容纳所有绘图元素?
- `Axes`:matplotlib宇宙的核心,容纳了大量元素用来构造一幅幅子图,一个figure可以由一个或多个子图组成
- `Axis`:axes的下属层级,用于处理所有和坐标轴,网格有关的元素
- `Tick`:axis的下属层级,用来处理所有和刻度有关的元素
四、两种绘图接口
matplotlib提供了两种最常用的绘图接口
1. 显式创建figure和axes,在上面调用绘图方法,也被称为OO模式(object-oriented style)
x = np.linspace(0,2,100)
fig, ax = plt.subplots()
ax.plot(x, x, label='linear') # linear 线性
ax.plot(x, x**2, label='quadratic') # quadratic 二次方
ax.plot(x, x**3, label='cubic') # cubic 三次方
ax.set_xlabel('x label') # x轴名称
ax.set_ylabel('y label') # y轴名称
ax.set_title("Simple Plot") # 标题名称
ax.legend()
plt.show()
2. 依赖pyplot自动创建figure和axes,并绘制同样的图
提示:出现错误 -?Python invalid non-printable character U+00A0 是复制粘贴时错误。一般先处理下复制的代码,去掉空格,或者再不行用笨办法重新敲一遍。实测在句尾确实有莫名奇妙的空格,去掉后正常运行。
五、通用绘图模板
? 由于matplotlib的知识点非常繁杂,在实际使用过程中也不可能将全部API都记住,很多时候都是边用边查。因此这里提供一个通用的绘图基础模板,任何复杂的图表几乎都可以基于这个模板骨架填充内容而成。初学者刚开始学习时只需要牢记这一模板就足以应对大部分简单图表的绘制,在学习过程中可以将这个模板模块化,了解每个模块在做什么,在绘制复杂图表时如何修改,填充对应的模块。
# step1 准备数据
x = np.linspace(0, 2, 100)
y = x**2
# step2 设置绘图样式,这一模块的扩展参考第五章进一步学习,这一步不是必须的,样式也可以在绘制图像是进行设置
mpl.rc('lines', 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() ;
【拓展】
思考题
没思考出来搜了一些参考
Matplotlib中的两种绘图API说明
在Matplotlib库中提供了两种风格的API供开发者使用:一种是Pyplot编程接口(state-based),一种是面向对象对象的编程接口(object-based)。
Pyplot封装了底层的绘图函数提供了一种绘图环境,使得我们可以直接像在MATLAB那样绘制图形。当我们使用import matplotlib.pyplot as plt 语句导入pyplot 模块,并使用plt.plot() 绘制图形的时候,默认的Figure 以及Axes 等对象会自动创建以支持图形的绘制。Pyplot一来使得对MATLAB绘图熟悉的童鞋更加容易上手,二来屏蔽了一些底层通用的绘图对象的创建细节,使用更加简洁。
在使用面向对象的编程接口时候,我们需要自己创建画布(FigureCanvas),自己创建图对象(Figure),自己创建Axes(一个Figure可以包含一个或者多个Axes,一个Axes可以理解为一个子图,使用一次plot() 绘图函数便会创建一个Axes),所有对象一起才能完成一次完整的绘图。使用面向对象编程接口有利于我们对于图形绘制的完整控制,但是相对于Pyplot接口可能需要书写更多的代码。
在Matplotlib官方文档中,虽然说推荐大家使用面向对象接口进行绘图,但是其中提供的例子大部分都是基于Pyplot接口的。
# step1 准备数据
x = np.linspace(0, 2, 100)
y = x**2
# step2 设置绘图样式
mpl.rc('lines', linewidth=4, linestyle='-.')
# step3 定义布局, 这一模块的扩展参考第三章进一步学习
?
# step4 绘制图像, 这一模块的扩展参考第二章进一步学习
plt.plot(x, y, label='linear')?
# step5 添加标签,文字和图例,这一模块的扩展参考第四章进一步学习
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend()
plt.show()
|