我有一些包含数据的numpy数组,我可以在2D网格上显示。有些数据是非物质的,我想屏蔽这些数据。但是,我无法弄清楚如何正确设置tricontour
的掩码属性。我试过了:
import matplotlib.pyplot as mp
import numpy as np
with open('some_data.dat', 'r') as infile:
x, y, z = np.loadtxt(infile, usecols=(0, 1, 2), unpack=True)
isbad = np.less(z, 1.4) | np.greater(z, 2.1)
mp.tricontourf(x, y, z, mask = isbad)
但结果数字根本没有掩盖。我试过masking part of a contourf plot in matplotlib,即
z2 = np.ma.array(z, mask= isbad)
mp.tricontourf(x, y, z2)
也不起作用。我想使用tricontourf
的{{1}} instrad,因为我不想对我的数据进行网格化。
contourf
在调用tricontourf
时导致分段错误这是图中,红色是我想要标记为非物质的颜色。
答案 0 :(得分:2)
这就是诀窍。我需要收集三角形的索引(它们是z的索引!),评估它们是否良好然后只接受三角形,因为至少一个角是有效的(将尺寸从(ntri,3)减小到ntri
triang = tr.Triangulation(x, y)
mask = np.all(np.where(isbad[triang.triangles], True, False), axis=1)
triang.set_mask(mask)
colplt = mp.tricontourf(triang, z)
mp.colorbar()
受此链接的启发:http://matplotlib.org/examples/pylab_examples/tripcolor_demo.html
答案 1 :(得分:0)
wsj的答案对我不起作用,因为它没有删除某些掩蔽点(我认为当并非所有节点都不好时)。
This solution做到了:
z[isbad] = numpy.NaN
z = numpy.ma.masked_invalid(z)
vmin, vmax = z.min(), z.max()
z = z.filled(fill_value=-999)
levels = numpy.linspace(vmin, vmax, n_points)
plt.tricontourf(x, y, z, levels=levels)