使用matplotlib简化三角测量

时间:2015-06-11 16:23:02

标签: python matplotlib

我在matplotlib中创建了一个三角测量对象(P矩阵中包含点坐标,T矩阵包含三角形节点,描述矩形减去一个洞)并计算了一些名为的标量字段在这个三角剖分的节点处的phi (使用应用于泊松方程的有限元方法)。使用这个三角测量我计算了渐变,这是我感兴趣的。我制作了这个矢量场的箭头图,一切都很好,矢量不与孔相交。

但是,当我想通过 streamplot 函数绘制流线时,它们会与孔相交,如下图所示:

enter image description here

问题是,为了追踪流线,我必须为 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)

我知道蒙面数组,但没有设法使用掩码来获得我想要的结果。我想创建一种蒙版的规则网格,然后在其上插入矢量字段,但我没有设法做到这一点。有人有这种问题的经验吗?任何建议将不胜感激。

谢谢!

1 个答案:

答案 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