首页 > 技术文章 > matplotlib绘图

tofengz 2020-09-24 10:28 原文

matplotlib绘图

显示图片

  • plt.polt()等绘图函数不会直接在窗口中绘图,只有调用plt.show()(窗口不会自动关闭)或plt.pause()(窗口自动关闭)时才将内存中的图绘制到窗口;
  • 程序碰到第一个plt.show()时,绘图后会暂停执行,直到手动关闭当前窗口才继续执行后面的代码
  • plt.pause(time)函数也能实现窗口绘图(不需要plt.show),但窗口只停留time时间便会自动关闭,然后再继续执行后面代码;plt.pause()会把它之前的所有绘图都绘制在对应坐标系中,而不仅仅是在当前坐标系中绘图;特别要注意的是,plt.pasue(0)将绘制之前的所有图像,且图像窗口不会自动关闭,但程序会停止在该语句所在位置,即使手动关闭窗口也不会继续执行后面的代码;

保存图片

import matplotlib.pyplot as plt

fig = plt.gcf()
plt.show()
fig.savefig("filename.png", dpi=100)

这样可以避免保存一个空白的图片。

颜色映射

单通道图像,有时候需要通过一定的颜色映射来进行可视化,多数时候还需要显示colorbar来标示颜色代表的数值,这里涉及几个常见问题:

  • 如何设置颜色映射
cmap = matplotlib.cm.jet
plt.imshow(img, cmap=cmap)
  • 如何显示colorbar
plt.imshow(img)
plt.colorbar()
  • 如何保持多张图的colorbar数值范围一致
# 方法一
plt.figure()
plt.subplot(1,2,1)
plt.imshow(d1, vmin=0, vmax=100)
plt.colorbar()

plt.subplot(1,2,2)
plt.imshow(d2, vmin=0, vmax=100)
plt.colorbar()
# 方法二
vnorm = mpl.colors.Normalize(vmin=0, vmax=100)

plt.figure()
plt.subplot(1,2,1)
plt.imshow(d1, norm=vnorm)
plt.colorbar()

plt.subplot(1,2,2)
plt.imshow(d2, norm=vnorm)
plt.colorbar()
  • pyplot直接保存会有一圈白边,如何去掉白边,同时关闭坐标轴显示
fig = plt.figure()
plt.imshow(img)
plt.axis('off')
plt.savefig("filename.png", bbox_inches='tight', dpi=fig.dpi, pad_inches=0.0)
  • 一个比较完整的示例
#指定colormap
cmap = matplotlib.cm.jet

#设定每个图的colormap和colorbar所表示范围是一样的,即归一化
norm = matplotlib.colors.Normalize(vmin=160, vmax=300)

#显示图形
gci = plt.imshow(img, cmap=cmap, norm=norm)

#配置一下坐标刻度等
ax = plt.gca()
ax.set_xticks(np.linspace(0,1,9))
ax.set_xticklabels( ('275', '280', '285', '290', '295',  '300',  '305',  '310', '315'))
ax.set_yticks(np.linspace(0,1,8))
ax.set_yticklabels( ('0.60', '0.65', '0.70', '0.75', '0.80','0.85','0.90','0.95'))

#显示colorbar
cbar = plt.colorbar(gci)
cbar.set_label('$T_B(K)$',fontdict=font)
cbar.set_ticks(np.linspace(160,300,8))
cbar.set_ticklabels( ('160', '180', '200', '220', '240',  '260',  '280',  '300'))

#设置label
ax.set_ylabel('Land Surface Emissivity',fontdict=font)
ax.set_xlabel('Land Surface Temperature(K)',fontdict=font)

#设置title
titleStr = '$T_B$ for Freq = ' + str(float(fp[1:-1])*0.01) + 'GHz'
plt.title(titleStr)
figname = fp + '.png'
plt.savefig(figname)
plt.clf()

参考

用matplotlib的imshow显示图像,设置colorbar的颜色范围
使用matplotlib的示例:调整字体-设置刻度、坐标、colormap和colorbar等

推荐阅读