matplotlib教程:初步📈子图绘制📈坐标投影📈刻度设置📈共享坐标轴📈内容填充📈文字和字体
伪彩图
【plt】中提供了三种矩阵可视化函数,分别是imshow, matshow以及pcolormesh,相较之下,前两者比较相似,且imshow常被用做图片展示工具,所以matshoww这个函数基本没什么人知道,二者对比如下
import matplotlib.pyplot as plt
import numpy as np
x = np.random.rand(5,5)
fig,axes = plt.subplots(1,2,figsize=(8,4))
axes[0].imshow(x)
plt.title("imshow")
axes[1].matshow(x)
plt.title("matshow")
plt.tight_layout()
plt.show()
左右两图几乎没有区别,并且矩阵中每个元素都是严格的方形,即其长宽比并不会随着图窗的变化而发生变化。
相比之下,pcolormesh就灵活很多,图中的每个元素均为长宽比可变的矩形,如果和text互相配合,就可以更加完美地表现矩阵,做到下图的效果
代码如下
def drawMat(x, ax=None):
M, N = x.shape
if not ax:
ax = plt.subplot()
arrM, arrN = np.arange(M), np.arange(N)
plt.yticks(arrM+0.5, arrM)
plt.xticks(arrN+0.5, arrN)
ax.pcolormesh(x)
ax.invert_yaxis()
for i,j in product(range(M),range(N)):
ax.text(j+0.2, i+0.55, f"{x[i,j]:.2}")
plt.show()
x = np.random.rand(5,5)
drawMat(x)
等高线
伪彩图可以通过颜色来标注矩阵中每个元素的大小,从而对矩阵元素的整体分布情况有一个大致的了解。而有时,我们希望更加清晰地了解矩阵元素的分层情况,这时可采用等高线图contour和contourf,与伪彩图相比,个中差别如下
X, Y = np.indices([100,100])/30 - 1.5
Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2)
fDct = {"contour": plt.contour, "contourf":plt.contourf,
"pcolormesh" : plt.pcolormesh, "imshow":plt.imshow}
fig = plt.figure(figsize=(9,6))
for i,key in enumerate(fDct, 1):
ax = fig.add_subplot(2,2,i)
fDct[key](Z)
plt.title(key)
plt.tight_layout()
plt.show()
colorbar
伪彩图通过伪彩色来表现矩阵元素的大小,而colorbar则标注了为彩图中的颜色映射值,一般来说,在【plt】绘图时,每个子图都可以设置其自身的色条,
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
for i in range(2):
ax = fig.add_subplot(2,1,i+1)
ax = plt.pcolormesh(np.random.rand(10,20))
plt.colorbar()
plt.show()
由于上下两张图采用了相同的伪彩映射,所以这两个色条有些重复了,为了让图像更加简洁,从而产生了一张图一个色条的需求。
下面新建一个坐标轴,以单独设置色条位置
fig = plt.figure()
for i in range(2):
ax = fig.add_subplot(2,1,i+1)
im = plt.pcolormesh(np.random.rand(10,20))
plt.axis('off')
# 指定colorbar的位置和大小
cax = fig.add_axes([0.92, 0.1, 0.02, 0.8])
fig.colorbar(im, cax=cax)
plt.show()
效果如下
这种处理方法有一个问题,即colorbar所在坐标系将无法控制,如果使用tight_layout来进行紧凑布局,那么左侧的图像会忽视色条铺满整个区域。
为了让色条可以在布局中维持不变,可通过GridSpec来进一步定制布局网格,
fig = plt.figure()
gs = plt.GridSpec(2, 2, width_ratios=[15, 1], height_ratios=[1, 1])
plt.subplot(gs[0, 0])
plt.title("A")
im = plt.pcolormesh(np.random.rand(10,20))
plt.axis('off')
plt.subplot(gs[1, 0])
plt.title("B")
im = plt.pcolormesh(np.random.rand(10,20))
plt.axis('off')
ax = plt.subplot(gs[:, 1])
fig.colorbar(im, cax=ax)
plt.show()
其中,width_ratios为横向的单元格宽度比例,height_ratios为纵向的单元格高度比例。绘图结果如下,这样一来,无论布局如何发生变化,左侧图形与右侧色条的宽度比值均为15:1,不会发生变化,从而在图像绘制时保证了风格的统一。文章来源:https://www.toymoban.com/news/detail-838047.html
文章来源地址https://www.toymoban.com/news/detail-838047.html
到了这里,关于matplotlib矩阵和图像的可视化表示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!