我正在尝试绘制一个三/四级网格以及该网格上的结果。我正在绘制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值时,它可以正常工作,看起来像这样:
但是,当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个侧面的网格元素
Matplotlib的颜色映射机制来自numpy.nan
不在时。相反,它适用于带掩码的数组。
facecolors = np.ma.array(facecolors, mask=np.isnan(facecolors))