【问题标题】:Matplotlib image plot - nan values shown as lowest color of colormaps instead of transparentMatplotlib 图像绘图 - nan 值显示为颜色图的最低颜色而不是透明
【发布时间】:2019-09-26 12:59:46
【问题描述】:

我正在使用matplotlib 3.0.3 并想使用FuncAnimation 模块创建图像绘图动画。对于绘图速度,我使用im.set_dataimshowim.set_array()plt.pcolormesh 更新图像数据(set_data 不能用作属性)。如果我用 NaN 值部分更新数据,imshow 将它们显示为空白像素,而pcolormesh 将它们显示为颜色图中的最低颜色(viridis 为蓝色)。

这是有意的,如果不是,为什么会这样?它似乎与set_array() 有关,因为pcolormesh 通常会将NaN 绘制为空白像素。

小例子:

import numpy as np
import matplotlib.pyplot as plt

fig1 = plt.figure()
im1 = plt.pcolormesh(np.random.rand(10,10))
im1.set_array((np.zeros((10,10)) * np.nan).ravel())

fig2 = plt.figure()
im2 = plt.imshow(np.random.rand(10,10))
im2.set_data(np.zeros((10,10)) * np.nan)

【问题讨论】:

    标签: python matplotlib plot color-mapping


    【解决方案1】:

    Matplotlib 图像不适用于 nans。应该改为使用掩码数组。那么这两种情况都是一样的(除了需要展平pcolormesh数组)。

    import numpy as np
    import matplotlib.pyplot as plt
    
    A = np.random.rand(10,10)
    B = np.ma.array(A, mask=np.ones((10,10)))
    
    fig1 = plt.figure()
    im1 = plt.pcolormesh(A)
    im1.set_array(B.ravel())
    plt.colorbar()
    
    fig2 = plt.figure()
    im2 = plt.imshow(A)
    im2.set_array(B)
    plt.colorbar()
    
    plt.show() 
    

    【讨论】:

    • 为什么它不能很好地与他们合作?我以某种方式期望一些标准化的行为来处理所有与图像相关的功能的 NaN。
    • 我猜主要是历史原因。在编写 matplotlib 时,numpy nan 还没有处于成熟状态。
    • @ImportanceOfBeingErnest 我正在通过下面的代码 import numpy.ma as ma z1=ma.masked_invalid(z1) 进行屏蔽,但屏蔽工作正常但我仍然将 nan 值绘制为最低值颜色。 type(z) (280495,) [0.0 3.0 4.0 5.0 6.0 --]
    猜你喜欢
    • 2015-02-22
    • 2014-05-08
    • 2014-10-12
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 2020-09-25
    相关资源
    最近更新 更多