You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

plt.savefig保存EPS格式时imshow中NaN显示异常的问题

问题描述

使用plt.imshow和plt.savefig保存包含NaN的二维数组图像时,调用plt.show()或保存为PNG格式时,NaN区域显示为白色,但保存为EPS文件后,NaN区域变成了黑色。以下是最小可复现代码:

import numpy as np
import matplotlib.pyplot as plt
plt.figure()
# MWE
data = np.ones([10,10]) # 生成测试数据
data[:,5] = np.nan # 将某列设为NaN

image = plt.imshow(data)
cbar = plt.colorbar(image)

plt.show()
plt.savefig("my_image.eps", format="eps")

请问这是操作失误还是Bug?如果不是Bug,有什么解决办法?

解决方案

这不是操作错误,是Matplotlib处理EPS矢量格式时的渲染特性——EPS对NaN值的默认填充色,和交互式窗口、PNG位图的默认设置不一致。

可以用以下两种方法解决:

  • 方法一:直接设置NaN区域的填充色
    在调用imshow后,通过色图的set_bad()方法指定NaN区域的颜色,比如设置为白色:
    import numpy as np
    import matplotlib.pyplot as plt
    plt.figure()
    data = np.ones([10,10])
    data[:,5] = np.nan
    
    image = plt.imshow(data)
    # 把NaN区域设为白色
    image.cmap.set_bad(color='white')
    cbar = plt.colorbar(image)
    
    plt.savefig("my_image.eps", format="eps")
    
  • 方法二:自定义包含NaN色的色图
    如果需要更灵活的配色控制,可以基于现有色图创建自定义色图,并指定NaN颜色:
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.colors import ListedColormap
    
    plt.figure()
    data = np.ones([10,10])
    data[:,5] = np.nan
    
    # 基于默认的viridis色图创建自定义色图
    original_cmap = plt.cm.viridis
    new_cmap = ListedColormap(original_cmap(np.linspace(0,1,256)))
    # 指定NaN区域为白色
    new_cmap.set_bad('white')
    
    image = plt.imshow(data, cmap=new_cmap)
    cbar = plt.colorbar(image)
    
    plt.savefig("my_image.eps", format="eps")
    

内容的提问来源于stack exchange,提问作者maxxpinse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 11:26:07