[使用matplotlib.collections.PolyCollection绘制等高线图时如何不给Nan值上色

问题描述 投票:0回答:1

我正在尝试绘制一个三/四级网格以及该网格上的结果。我正在绘制CFD模拟的结果。

我正在使用matplotlib.collections.PolyCollection进行绘制,因为它处理非tri元素,而其他方法仅支持tri元素。

我当前的代码工作正常,但是当我尝试绘制一些没有水的单元格的结果(现在将它们设置为np.nan时,绘图崩溃并且轮廓线颜色全部弄乱了。

我当前的代码是:

ax = plt.subplot(111)
cmap = matplotlib.cm.jet
polys = element_coords #list of Nx2 np.arrays containing the coordinates of each element polygon)
facecolors = element_values #np array of values at each element, same length as polys
pc = matplotlib.collections.PolyCollection(polys, cmap=cmap)
pc.set_array(facecolors)
ax.add_collection(pc)
ax.plot()

[element_values不包含任何nan值时,它可以正常工作,看起来像这样:

works

但是,当element_values确实包含nan值时,它崩溃并且出现此错误:

C:\Users\deden\AppData\Local\Continuum\anaconda3\envs\test\lib\site-packages\matplotlib\colors.py:527: RuntimeWarning: invalid value encountered in less
  xa[xa < 0] = -1

我玩过element_values,可以确认只有在存在nan值时才会发生这种情况。

起初,我只是为了使它们清楚而试图忽略nan值:

pc.cmap.set_bad(color='white',alpha=0)

但是我仍然遇到相同的错误。

所以...我尝试将所有nan值设置为-999,然后尝试像这样切断色彩图:

vmin = np.nanmin(facecolors)
vmax = np.nanmax(facecolors)
facecolors[np.isnan(facecolors)] = -999
pc.cmap.set_under(color='white',alpha=0)

然后尝试根据我见过的其他堆栈问题来设置颜色图的限制。.like:

pc.cmap.set_clim(vmin,vmax)

但后来我得到:

AttributeError: 'ListedColormap' object has no attribute 'set_clim'

我在这里没主意...有人可以帮我吗?我只想不对任何值为nan的元素进行颜色设置。

要重现我的错误,您可以尝试使用此虚拟数据:

polys = [np.array([[ 223769.2075899 , 1445713.24572239],
                   [ 223769.48419606, 1445717.09102757],
                   [ 223764.48282055, 1445714.84782264]]),
         np.array([[ 223757.9584215 , 1445716.57576502],
                   [ 223764.48282055, 1445714.84782264],
                   [ 223762.05868674, 1445720.48031478]])]
facecolors = np.array([np.nan, 1]) #will work if you replace np.nan with a number

旁注-如果有人知道如何在没有多边形集合的情况下绘制此网格+数据,那将很棒。它包含3个和4个侧面的网格元素

python matplotlib mesh colormap
1个回答
0
投票

Matplotlib的颜色映射机制来自numpy.nan不在时。相反,它适用于带掩码的数组。

facecolors = np.ma.array(facecolors, mask=np.isnan(facecolors))
© www.soinside.com 2019 - 2024. All rights reserved.