Matplotlib tripcolor错误?

时间:2014-06-03 17:33:03

标签: python matplotlib contour triangulation

我想使用matplotlib.pyplot中的tripcolor来查看我的一些数据的彩色轮廓。

使用Paraview从z = cst的XY平面提取数据。我直接从Paraview中导出csv中的数据,这对我来说是三角测量平面。

问题在于取决于平面位置(即网格)tripcolor有时会给我带来好的或坏的结果。

这是一个简单的示例代码和结果来说明它:

代码

import matplotlib.pyplot as plt
import numpy as np

p,u,v,w,x,y,z  = np.loadtxt('./bad.csv',delimiter=',',skiprows=1,usecols=(0,1,2,3,4,5,6),unpack=True)

NbLevels = 256

plt.figure()
plt.gca().set_aspect('equal')

plt.tripcolor(x,y,w,NbLevels,cmap=plt.cm.hot_r,edgecolor='black')

cbar = plt.colorbar()
cbar.set_label('Velocity magnitude',labelpad=10)

plt.show()

tripcolor的结果

enter image description here

以下是导致问题的file

我听说过matplotlib的tripcolor有时会出错,所以它是不是一个bug?

2 个答案:

答案 0 :(得分:5)

正如@Hooked强调的那样,这是Delaunay三角剖分的正常行为。 要删除不需要的三角形,您应该通过明确传递三角形来提供自己的Triangulation

在您的情况下,这很容易,因为您的数据几乎是结构化的:我建议在平面(r,theta)中执行Delaunay三角剖分,然后将这些三角形传递给初始(x,y)数组。您可以使用内置的TriAnalyzer类从(r,theta)三角剖分中删除非常 flat 三角形(它们可能由于舍入错误而存在)。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.tri as mtri

p,u,v,w,x,y,z  = np.loadtxt('./bad.csv',delimiter=',',skiprows=1,usecols=(0,1,2,3,4,5,6),unpack=True)

r = np.sqrt(y**2 + x**2)
tan = (y / x)
aux_tri = mtri.Triangulation(r/np.max(r), tan/np.max(tan))
triang = mtri.Triangulation(x, y, aux_tri.triangles)
triang.set_mask(mtri.TriAnalyzer(aux_tri).get_flat_tri_mask())

NbLevels = 256

plt.figure()
plt.gca().set_aspect('equal')

plt.tripcolor(triang, w, NbLevels, cmap=plt.cm.jet, edgecolor='black')

cbar = plt.colorbar()
cbar.set_label('Velocity magnitude',labelpad=10)
plt.show()

enter image description here

答案 1 :(得分:2)

这可能是因为Paraview调用的Delaunay triangulation创建了一个点的凸包(应该如此)。为了测试这个,我使用了matplotlib.tri.Triangulation并从x-y值绘制了结果网格:

import matplotlib.tri as tri
plt.scatter(x,y)
w[:] = 1
triang = tri.Triangulation(x, y)
plt.tripcolor(triang,w,alpha=.2)

enter image description here

显示相同的效果。可以手动或使用非凸边界探测器从网格中移除不需要的三角形。