MATLAB填写PyPlot

时间:2015-11-11 00:48:16

标签: python matlab matplotlib

在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中是否有相同的命令或其他方便的方法?

1 个答案:

答案 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);

生成这个图(这将是我们的控件): matlabfill_control

首先,您必须确定数据在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)

结果: python, automatic triangulation

您可以看到结果与控件不同,因为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)

结果: python manual triangulation

这显然与MATLAB版本相当。为了实现更平滑的插值,您可以在代码中增加subdiv,但要小心:每个三角形分成4^subdiv个部分,因此绘图的内存需求会快速增长非常这个参数。