我想使用 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
这是导致问题的 file 。
我听说 matplotlib 的 tripcolor 有时有问题,那么它是否是错误?
最佳答案
正如@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()
关于python - Matplotlib 三色错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24021477/