Matplotlib保存64×64像素高度图时出现白色阴影边框的解决方法
去除Matplotlib高度图的白色阴影边框
问题描述
尝试用Matplotlib制作64×64像素的简易高度图,保存图像时绘图区域出现带白色阴影的边框,已尝试修改shading参数但无效。
原代码如下:
import matplotlib.pyplot as plt import numpy as np data = 0.5*np.ones((100,100)) X,Y = np.linspace(1,100,100),np.linspace(1,100,100) X,Y = np.meshgrid(X,np.linspace(0,max(abs(X)),100)) px = 1/plt.rcParams['figure.dpi'] # pixel in inches res_v = 64 #vertical resolution in pixels res_h = 64 #horizontal resolution in pixels fig, ax = plt.subplots(figsize=(res_h*px, res_v*px)) ax.pcolormesh(X,Y,data, cmap='Greys',shading='gouraud',vmax=1,vmin=0) plt.axis('off') plt.savefig("gradient.png", bbox_inches='tight',pad_inches=0)
原问题效果:
- 带白色边框的绘图:

- 放大后的绘图:

解决方案
白色边框本质是绘图区域与画布边缘不完全贴合,加上抗锯齿导致的边缘采样虚影,可通过以下步骤解决:
1. 让数据与目标分辨率完全匹配
将data尺寸设为64×64(和目标图像分辨率一致),同时生成对应尺寸的网格,避免缩放带来的边缘误差:
# 生成64x64的均匀数据 data = 0.5 * np.ones((64, 64)) # pcolormesh需要N+1个网格点绘制NxN色块,所以生成0到64的65个点 X, Y = np.meshgrid(np.arange(65), np.arange(65))
2. 关闭抗锯齿并强制坐标轴范围
关闭pcolormesh的抗锯齿,避免边缘模糊;同时严格设置坐标轴范围与网格一致,确保绘图区域填满画布:
# 绘制时关闭抗锯齿 ax.pcolormesh(X, Y, data, cmap='Greys', shading='flat', vmax=1, vmin=0, antialiased=False) # 强制坐标轴范围与网格边界对齐 ax.set_xlim(0, 64) ax.set_ylim(0, 64)
3. 优化保存参数
保存时设置画布背景透明,关闭抗锯齿,彻底消除边缘的白色虚影:
plt.savefig("gradient.png", bbox_inches='tight', pad_inches=0, facecolor='none', edgecolor='none', antialiased=False)
完整修改后代码
import matplotlib.pyplot as plt import numpy as np # 匹配目标分辨率的64x64数据 data = 0.5 * np.ones((64, 64)) # 生成对应N+1的网格点 X, Y = np.meshgrid(np.arange(65), np.arange(65)) px = 1 / plt.rcParams['figure.dpi'] res_v, res_h = 64, 64 fig, ax = plt.subplots(figsize=(res_h*px, res_v*px), dpi=plt.rcParams['figure.dpi']) # 关闭抗锯齿,避免边缘模糊 ax.pcolormesh(X, Y, data, cmap='Greys', shading='flat', vmax=1, vmin=0, antialiased=False) # 严格对齐坐标轴范围 ax.set_xlim(0, 64) ax.set_ylim(0, 64) plt.axis('off') # 优化保存参数,消除白色边框 plt.savefig("gradient.png", bbox_inches='tight', pad_inches=0, facecolor='none', edgecolor='none', antialiased=False) plt.close()
内容的提问来源于stack exchange,提问作者Joao Cavalcante
相关产品推荐
相关产品推荐

