Matplotlib tripcolor bug?

3 投票
2 回答
1776 浏览
提问于 2025-04-18 08:27

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

这些数据是从一个XY平面上提取的,z值是常数,使用的是Paraview。我直接从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的结果

在这里输入图片描述

这是一个文件,它引发了这个问题。

我听说matplotlib的tripcolor有时候会有问题,那这算是个bug吗?

2 个回答

2

这可能是因为Paraview调用的德劳内三角剖分创建了一个点的凸包(这其实是正常的)。为了验证这一点,我使用了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

从图中可以看到同样的效果。可能可以通过手动或者使用非凸边界查找器来去掉网格中不需要的三角形。

8

正如@Hooked所提到的,这是一种正常的德劳内三角剖分行为。要去掉不需要的三角形,你需要自己提供一个Triangulation,也就是明确地传入你想要的三角形。

在你的情况下,这其实很简单,因为你的数据几乎是有结构的:我建议你先在平面坐标(r, theta)上进行德劳内三角剖分,然后再把这些三角形传递到最初的(x, y)数组中。你可以使用内置的TriAnalyzer类来去掉非常扁平的三角形(这些三角形可能是由于四舍五入误差产生的)。

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

撰写回答