我在matplotlib中创建了一个三角测量对象(P矩阵中包含点坐标,T矩阵包含三角形节点,描述矩形减去一个洞)并计算了一些名为的标量字段在这个三角剖分的节点处的phi (使用应用于泊松方程的有限元方法)。使用这个三角测量我计算了渐变,这是我感兴趣的。我制作了这个矢量场的箭头图,一切都很好,矢量不与孔相交。
但是,当我想通过 streamplot 函数绘制流线时,它们会与孔相交,如下图所示:
问题是,为了追踪流线,我必须为 streamplot 函数创建一个结构化网格。但由于我的矢量场没有在常规网格的节点处定义,我需要在这些节点处插值。为此,我使用了 griddata 。问题是,在这样做时,孔被规则网格覆盖,因此矢量场在孔内定义,因此得到结果。以下是产生图片的相关代码:
def plot_streamlines(P, T, phi):
triangulation = tr.Triangulation(P[:,0], P[:,1], T)
interpolator = tr.CubicTriInterpolator(triangulation, phi)
(u_x,u_y) = interpolator.gradient(triangulation.x, triangulation.y)
grid_x, grid_y = np.mgrid[x_min:x_max:100j, y_min:y_max:100j]
grid_u_x = ip.griddata(P, u_x, (grid_x,grid_y), method='cubic')
grid_u_y = ip.griddata(P, u_y, (grid_x,grid_y), method='cubic')
pl.streamplot(grid_x[:,0], grid_y[0,:], -grid_u_x.T, -grid_u_y.T)
我知道蒙面数组,但没有设法使用掩码来获得我想要的结果。我想创建一种蒙版的规则网格,然后在其上插入矢量字段,但我没有设法做到这一点。有人有这种问题的经验吗?任何建议将不胜感激。
谢谢!
答案 0 :(得分:0)
在您的代码示例中,interpolator.gradient
已经是插补器,即您不需要将其与griddata
结合使用。尝试:
grid_u_x, grid_u_y = interpolator.gradient(grid_x, grid_y)
由于此插值器知道您的三角测量网格,因此它应该是在网格外部填充nan
的速度矢量。希望Streamplot
能够像这个例子一样优雅地处理这个问题:
http://matplotlib.org/examples/images_contours_and_fields/streamplot_demo_masking.html