Matplotlib中imshow设interpolation='None'保存PDF时alpha不生效问题
问题原因
这是matplotlib 3.4.3及更早版本存在的已知bug:当imshow指定interpolation='None'参数时,PDF、SVG等矢量导出后端会忽略逐像素设置的alpha参数,仅保留颜色通道的渲染结果。
可行解决方法
- 方案1:替换插值参数为
'nearest''nearest'的显示效果和'None'完全一致,不会出现插值模糊,同时可以兼容矢量后端的alpha通道导出,修改后的代码如下:
import matplotlib.pyplot as plt import numpy as np arr = np.abs(np.sin(np.linspace(0, 2*np.pi))) x,y = np.meshgrid(arr,arr) arr = x*y plt.figure() # 仅修改interpolation参数为'nearest'即可 plt.imshow(arr, alpha=arr, interpolation='nearest') plt.savefig("fig1.pdf")
- 方案2:预生成RGBA四通道数组传入
imshow
如果必须使用interpolation='None'参数,可以提前将颜色数据和alpha通道合并为RGBA数组,规避后端渲染bug:
import matplotlib.pyplot as plt import numpy as np from matplotlib.colors import Normalize arr = np.abs(np.sin(np.linspace(0, 2*np.pi))) x,y = np.meshgrid(arr,arr) arr = x*y # 归一化数据获取颜色映射 norm = Normalize(vmin=arr.min(), vmax=arr.max()) cmap = plt.get_cmap('viridis') # 可替换为你需要的配色方案 rgba_arr = cmap(norm(arr)) # 赋值alpha通道 rgba_arr[..., -1] = arr plt.figure() plt.imshow(rgba_arr, interpolation='None') plt.savefig("fig1.pdf")
- 方案3:升级matplotlib到3.5.0及以上版本
该bug在matplotlib 3.5.0版本中已被修复,升级后原代码即可正常导出带alpha的PDF文件。
内容的提问来源于stack exchange,提问作者matmoa
相关产品推荐
相关产品推荐

