在MATLAB中,填充多边形可以使用fill
命令绘制节点中定义的颜色(例如,有2个三角形):
x = [0 1 1; 0 1 0]';
y = [0 0 1; 0 1 1]';
z = [0 1 2; 0 2 3]';
fill(x,y,z)
在matplotlib
中是否有相同的命令或其他方便的方法?
答案 0 :(得分:1)
我设法找到了基于this question的解决方案及其中的答案。似乎内部插值没有内置到pyplot
中,因此您需要通过在数据上创建更精细的插值网格来解决此问题。
在MATLAB中使用示例数据:
x = [0 1 1; 0 1 0]';
y = [0 0 1; 0 1 1]';
z = [0 1 2; 0 2 3]';
fill(x,y,z);
首先,您必须确定数据在python
中的表示方式。我将要使用的函数的自然输入是1d数组,因此您可能会丢弃数据中的多重性。如果您实际上并不关心三角形,而只关注z
格局,那么您可以让python
为您进行三角测量:
from matplotlib import tri, cm
import matplotlib.pyplot as plt
x=[0, 1, 1, 0]
y=[0, 0, 1, 1]
z=[0, 1, 2, 3]
triang=tri.Triangulation(x,y) #Delaunay triangulation of input
refiner=tri.UniformTriRefiner(triang)
interp=tri.LinearTriInterpolator(triang,z) #linear interpolator
new,new_z=refiner.refine_field(z,interp,subdiv=6) #refined mesh; uses 4**subdiv!
fig = plt.figure()
plt.tripcolor(new.x,new.y,new_z,cmap=cm.jet)
您可以看到结果与控件不同,因为matplotlib
选择了另一个三角测量,就像我们在MATLAB中所做的那样。如果你的三角形很小,而你只需要一个平滑的图形,那么这就足够了。
但是,可以手动提供三角测量。将MATLAB输入转换为python
可接受的格式并不是那么简单,所以这取决于你是多么绝望。对于我们的小例子,我可以手动选择三角形:
x=[0, 1, 1, 0]
y=[0, 0, 1, 1]
z=[0, 1, 2, 3]
tridat=[[0,3,2],[0,2,1]] # 2 triangles in counterclockwise order
triang=tri.Triangulation(x,y,tridat) #this has changed
refiner=tri.UniformTriRefiner(triang)
interp=tri.LinearTriInterpolator(triang,z) #linear interpolator
new,new_z=refiner.refine_field(z,interp,subdiv=6) #refined mesh
fig = plt.figure()
plt.tripcolor(new.x,new.y,new_z,cmap=cm.jet)
这显然与MATLAB版本相当。为了实现更平滑的插值,您可以在代码中增加subdiv
,但要小心:每个三角形分成4^subdiv
个部分,因此绘图的内存需求会快速增长非常这个参数。