📅 系列:一起学Python | 难度:⭐⭐ | 预计阅读:5分钟
🔗 上期回顾:第114天:imshow 图像显示
前面我们学了各种绘图技巧:折线、柱状、散点、饼图、热力图……但画出来只是第一步,能把图清晰、规范地保存到本地,才算真正完成了数据可视化的闭环。
Matplotlib 提供了两种保存图像的核心方法:
plt.savefig() | ||
plt.imsave() |
imsave() —— 它是处理纯图像数据的利器。imsave() 参数解析matplotlib.pyplot.imsave(fname,arr,cmap=None,format=None,origin=None,dpi=100,metadata=None,pil_kwargs=None)
fname | 'output.png''/home/user/fig.jpg' | |
arr | ||
cmap | 'gray'、'hot' | |
format | 'png''jpg'、'bmp'、'tiff' | |
origin | 'upper''lower' | |
dpi | ||
pil_kwargs | {'quality': 95} 控制JPEG质量 |
import matplotlib.pyplot as pltimport numpy as np# 创建一个二维的图像数据img_data = np.random.random((100, 100))# 显示图像plt.imshow(img_data)# 保存图像到磁盘上plt.imsave('runoob-test.png', img_data)

imsave() vs savefig():到底用哪个?import numpy as npimport matplotlib.pyplot as pltdata = np.random.rand(100, 100)# ========== 方法1:savefig() —— 保存"整张图表" ==========plt.imshow(data, cmap='hot')plt.title('hot')plt.colorbar()plt.savefig('chart_output.png', dpi=150, bbox_inches='tight')# 保存结果:包含坐标轴、标题、颜色条、白边# ========== 方法2:imsave() —— 保存"纯图像数据" ==========plt.imsave('image_output.png', data, cmap='hot')# 保存结果:只有100x100像素的热力图本身,无任何装饰
savefig() = 截图模式(拍的是"整个画板")
imsave() = 导出模式(导出的是"图像素材")
选择建议:
要放进PPT/论文/报告 → savefig()
要作为图像素材/输入数据/纹理贴图 → imsave()
import numpy as npimport matplotlib.pyplot as pltimport matplotlib.font_manager as fmimport os# ================= 1. 字体加载(解决报错的核心) =================font_path = "simhei.ttf" # 确保你已经在当前目录上传了 simhei.ttfif not os.path.exists(font_path):font_path = "/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc" # 备用系统字体prop = fm.FontProperties(fname=font_path)plt.rcParams['axes.unicode_minus'] = False# 生成 100x100 随机图像数据img_data = np.random.random((100, 100))# 先显示看看plt.figure(figsize=(5, 5))plt.imshow(img_data)plt.title('预览:随机噪声图', fontproperties=prop)plt.axis('off')plt.show()# 保存到本地(默认PNG格式)plt.imsave('runoob-test.png', img_data)print("✅ 已保存:runoob-test.png")

# 生成灰度数据img_gray = np.random.random((200, 200))# 保存时指定 cmap='gray',确保输出为真正的灰度图plt.imsave('test_gray.png', img_gray, cmap='gray')# 也可以保存为 JPG 格式plt.imsave('test_gray.jpg', img_gray, cmap='gray')print("✅ 已保存:test_gray.png 和 test_gray.jpg")
cmap='gray',二维数据默认会用 viridis 彩色映射保存,不是灰度!# 创建 100x100 的彩色图像(3通道:R, G, B)img_color = np.zeros((100, 100, 3))img_color[:, :, 0] = np.random.random((100, 100)) # 红色通道img_color[:, :, 1] = np.random.random((100, 100)) # 绿色通道img_color[:, :, 2] = np.random.random((100, 100)) # 蓝色通道# 显示预览plt.figure(figsize=(5, 5))plt.imshow(img_color)plt.title('预览:RGB彩色图', fontproperties=prop)plt.axis('off')plt.show()# 保存为 JPEG(彩色图不需要 cmap)plt.imsave('test_color.jpg', img_color)# 保存为 PNG(无损格式,适合后续处理)plt.imsave('test_color.png', img_color)print("✅ 已保存:test_color.jpg 和 test_color.png")

# 生成一个漂亮的热力图数据x = np.linspace(0, 4*np.pi, 300)y = np.linspace(0, 4*np.pi, 300)X, Y = np.meshgrid(x, y)Z = np.sin(X) * np.cos(Y)# 保存为高质量 PNGplt.imsave('heatmap_highres.png', Z, cmap='hot', origin='lower')# 保存为 JPG,控制质量(通过 pil_kwargs)plt.imsave('heatmap_compressed.jpg', Z, cmap='hot', origin='lower',pil_kwargs={'quality': 90, 'optimize': True})print("✅ 高质量图像已保存!")

imsave() 会根据文件扩展名自动推断格式,无需手动指定 format 参数。
# 基础保存plt.imsave('output.png', data)# 指定颜色映射(二维数据必加)plt.imsave('output.png', data, cmap='hot')# 指定原点和格式plt.imsave('output.jpg', data, cmap='viridis', origin='lower')# 高质量 JPEG(控制压缩质量)plt.imsave('output.jpg', data, cmap='coolwarm',pil_kwargs={'quality': 95})# 与 savefig 对比plt.imshow(data)plt.savefig('chart.png', dpi=300, bbox_inches='tight') # 保存整张图plt.imsave('image.png', data, cmap='viridis') # 只保存图像数据
基础题:生成一个 50×50 的随机矩阵,用 imsave() 保存为 PNG,并用 cmap='coolwarm'
进阶题:生成一个 200×200 的正弦波矩阵,分别用 imsave() 和 savefig() 保存,对比文件大小和图像内容差异
挑战题:创建一个 RGB 彩色渐变图(从左到右由红变蓝),保存为高质量 JPEG(quality=95)
今天我们掌握了 Matplotlib 图像保存的核心技能:
✅ plt.imsave() —— 保存纯图像数据,无坐标轴等装饰
✅ fname —— 文件名决定格式(.png/.jpg/.bmp)
✅ cmap —— 二维数据必须指定,否则颜色可能不对
✅ origin —— 控制图像方向,避免上下颠倒
✅ pil_kwargs —— 精细控制 JPEG 质量等参数
✅ 与 savefig() 分工明确:要图表用 savefig,要素材用 imsave
savefig 拍的是"照片"(含背景),imsave 导的是"素材"(纯图像)。
imsave(),让你的数据可视化成果从"屏幕上的草稿"变成"可交付的成品"。