【问题标题】:MATLABs fill in PyPlotMATLAB 填充 PyPlot
【发布时间】:2015-11-11 00:48:15
【问题描述】:

在 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 中是否有等效的命令或其他方便的方法来执行相同的操作?

【问题讨论】:

  • 我看到了,那个问题。但是,据我了解,该函数以相同的颜色绘制整个多边形?在 MATLAB 中,可以指定角的颜色,以便中间的颜色是渐变的,如示例中所示。
  • 那么你的真实数据到底是什么样的?我只发现matplotlib.imshow 可以在你的脸上进行插值,但假设一个矩形网格为xy...
  • 基本上我在网格中有元素(在本例中为三角形),具有节点值。很像上面的例子。可以将数据转换为每个节点的坐标数据(比如向量X,Y),节点值在向量Z 中。也许这可以更容易地绘制?没有必要绘制实际元素。
  • 非常如此。如果xy 在网格上,如x,y=numpy.meshgrid(xarr,yarr),并且z 再次在该网格上定义,可能是xy 的函数,那么matplotlib.imshow(z,interpolation='bilinear',extent=... 会做一些事情非常相似。但是您需要一个等距网格,因为imshow 是为绘制图像而设计的,并将您的数据解释为像素(并且可能会翻转坐标轴)。不幸的是,我找不到另一个能够进行内部插值的函数。

标签: python matlab matplotlib


【解决方案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 中的表示方式。我将要使用的函数的自然输入是一维数组,因此您可能会丢弃数据中的多重性。如果您实际上并不关心三角形,而只关心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 部分,因此使用此参数进行绘图的内存需求非常快速增长。

【讨论】:

  • 看起来很棒!干得好先生。这次我最终使用了另一种解决方案,下次肯定会研究这个。
  • @kirderf 谢谢,这种方法效率不高,所以你可能最好使用你找到的其他解决方案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 2018-03-06
相关资源
最近更新 更多