Rag*_*loo 2 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()
Run Code Online (Sandbox Code Playgroud)
tripcolor的结果

这是导致问题的文件.
我听说matplotlib的tripcolor有时会出错,所以它是不是一个bug?
正如@Hooked强调的那样,这是Delaunay三角剖分的正常行为.要删除不需要的三角形,您应该Triangulation通过明确地传递三角形来提供自己
在你的情况下这很容易,因为你的数据几乎是结构化的:我建议在平面(r,theta)中执行Delaunay三角剖分,然后将这些三角形传递给初始(x,y)数组.您可以使用内置TriAnalyzer类从(r,theta)三角剖分中移除非常平坦的三角形(它们可能由于舍入误差而存在).
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()
Run Code Online (Sandbox Code Playgroud)
