鉴于以往使用matplotlib都是百度来的,一旦自己上手就无能为力,所以这次简单入门一下matplotlib,搞清楚基本概念和基础用法。之所以又叫抛砖引玉是因为matplotlib比较太强,不可能总结的完,所以主要针对常用而进行的总结,如果能够基本了解,后面遇到更高要求百度一下函数的参数啊之类的,就可以制作更高端的效果。
在使用matplotlib时需要了解figure和axes两个概念。figure就是一张画布,没有任何内容的画布。axes不好解释,它是轴axis的复数形式,意味着axes是一套坐标轴,一套坐标就包括了标题、轴名、样式等等。
所以我们画图都是先建一个figure,然后再建一个axes,然后在axes上绘制曲线、设置title、设置样式等(实际上很多代码都是直接plt.xxx开始画,这可以理解为高级API,都自动帮你处理了,但是遇到复杂一点的可能就没那么灵活了,所以建议还是按上面这种最佳实践方法来写)。
首先是构建figure和axes,一般有三种方式:
fig=plt.figure() # 新建一个空figure,没有axes
fig,ax=plt.subplots() # 新建一个有axes的figure
#新建一个有2*2个格子的axes的figure。比如这里fig就是整个图,而ax有4个子元素,每个元素代表一个格子让我们绘图
fig,ax1=plt.subplots(2,2)
(plt.xxx简单但是不灵活,建议不要这么写)
比如在一个figure上划分两个Axes,一个画sin函数图,一个画cos函数图。
import matplotlib.pyplot as plt import numpy as np fig, ax = plt.subplots(1, 2) # 将Axes划分为1*2个格子 x = np.arange(0, 10, 0.1) sin = np.sin(x) cos = np.cos(x) ax[0].plot(x, sin) # 格子1绘制sin函数 ax[1].plot(x, cos) # 格子2绘制cos函数 plt.show() # 显式(在后面会介绍为什么要show)
'运行
从2中我们绘制了一个图,但是信息太少了,什么title、style都没有。但是一个图有很多属性,比如轴、间距、标题等等,具体它们是指什么?设置他们的方法又是什么?
从上图我们就得到一些常用的诸如轴名、标题、图例等样式的设置。
总体来说可以分为两种,一种是针对Axes的,比如坐标轴需要设置标题、轴名、控制轴间距范围等等;另一种是针对图(也就是根据数据画的线条等)需要设置颜色、样式等等
针对Axes:
# 比如
axes.Axes.set_xlim()和axes.Axes.set_ylim() # 手动设置值域范围
axes.Axes.set_title() # 标题
axes.Axes.set_xlabel()和axes.Axes.set_ylabel() # 轴名
......
针对图:
这部分主要是设置颜色、标记、线条样式等。
先看例子,下图是ax[1].plot(x, cos,'r-.v')
的绘制效果,在这里'r-.v'
就是规定了线条为红色+点划线+节点用倒三角表示,其实就是颜色字符+线型字符+标记字符的组合。
注意线型参数和标记字符联合决定线条样式,如果都不指定则采用模型线条,如果只指定标记字符则不显式线型(也就是如果fmt指定为’o’,则图形只有节点没有连线,就成了散点图)
更多fmt以及复杂的属性设定:
综合上面针对Axes和图的“美化”,一个demo如下:
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(1, 2) # 创建一个带Axes的fig,并划分为两个格子
x = np.arange(0, 10, 0.1)
sin = np.sin(x)
cos = np.cos(x)
# ax[0] 表示格子1
ax[0].plot(x, sin,'o') # 表示为蓝色-实现-节点用实心圈表示
ax[0].set_title("sin function") # 设置标题
ax[0].set_xlabel("x axis") # 设置x轴名
ax[0].set_ylabel("y axis") # 设置y轴名
ax[1].plot(x, cos,'r-.v') # 表示为 红色-点划线--节点用倒三角表示
ax[1].set_title("cos function")
ax[1].set_xlabel("x axis")
ax[1].set_ylabel("y axis")
plt.show()
简单,遵循一个函数:plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
比如:
ax[0].plot(x, sin,'o',x,cos,'r-.v') # 依次画sin和cos函数图像
(实际上调用两次plot也行)
上面说了这么多,那么能够plot的数据类型是什么?
经验发现,plt在jupyter和pycharm中使用有所不同,主要是显示方法上的不同。比如pycharm必须要加plt.show()
才能正常显示。
这里主要是object-oriented interface和pyplot interface的区别:
x = np.linspace(0, 2, 100)
# Note that even in the OO-style, we use `.pyplot.figure` to create the figure.
fig, ax = plt.subplots() # Create a figure and an axes.
ax.plot(x, x, label='linear') # Plot some data on the axes.
ax.plot(x, x**2, label='quadratic') # Plot more data on the axes...
ax.plot(x, x**3, label='cubic') # ... and some more.
ax.set_xlabel('x label') # Add an x-label to the axes.
ax.set_ylabel('y label') # Add a y-label to the axes.
ax.set_title("Simple Plot") # Add a title to the axes.
ax.legend() # Add a legend.
x = np.linspace(0, 2, 100)
plt.plot(x, x, label='linear') # Plot some data on the (implicit) axes.
plt.plot(x, x**2, label='quadratic') # etc.
plt.plot(x, x**3, label='cubic')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend()
正因为这些区别,pyplot interface通常用在交互式比如jupyter这种里面,而OO interface用在非交互式比如pycharm这种直接在函数里或代码里使用。
show():
在非交互式模式中,所有的行为都是delay的,要等show函数之后才执行。show函数能够被调用多次,等上一个窗口关闭后才显式下一张图片:
import numpy as np import matplotlib.pyplot as plt plt.ioff() for i in range(3): plt.plot(np.random.rand(10)) plt.show()
'运行
上面都是在绘制曲线等使用,但是我们还可以使用plt来显示图片。
主要使用plt.imshow()来显示图像,参数如下:
plt.imshow(X,
cmap=None,
norm=None,
......
)
标量数据(意味着不能是tensor?),可以是RGB(A)的3D或4D数据,也可以是2D数据(默认伪彩色显示)。支持的数组形状包括: (W,H)、(W,H,3)、 (W,H,4)
(通道后置)。
数据类型为0~1的浮点数或者0~255的整型数
注意伪彩色:对于2D的灰度图使用了cmap来控制显示色彩,如果直接显示,会显示伪彩色图的图像(默认cmap=“viridis”)。
对于RGB和RGBA则忽略cmap,正常显示。所以如果像显示灰度图则需要修改cmap='gray'或者cmap=plt.cm.gray
在7.1中已经有所了解,plt中有很多种cmap,在color example code: colormaps_reference.py,并且你可以在Source code运行,会可视化出各种cmap样式,供你选择,图例代表最左侧值=0,最右侧值=1(或者uint8的255),所以你图中像素值接近0的就显示左侧的颜色,像素值接近1的就显示右侧的颜色
。
比如会灰度图像换上’bwr’(从图例看出越黑颜色越蓝,月亮颜色越红,中间亮度则越白)的cmap样式:
该参数用于在进行cmap颜色映射前,将输入data缩放到[0,1]之间。默认使用线性缩放:将最小值映射为0,最大值映射为1.
当然也可以指定比如’linear’,'log’等其他映射变换方式。