Matplotlib 2.0.2的Plot_trisurf

时间:2017-05-29 13:57:28

标签: python matplotlib mplot3d

将matplotlib版本从1.3.1更新为2.0.2后,当我想使用plot_trisurf通过3d-points生成TIN时,我得到了一个难以理解的结果。我的测试代码如下:

import sys
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
import numpy
from numpy.random import randn
from scipy import array, newaxis

chunk = numpy.loadtxt('test.xyz')  #test.xyz contains 38010 points,
DATA=numpy.array(chunk)
Xs = DATA[:,0]
Ys = DATA[:,1]
Zs = DATA[:,2]

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

surf = ax.plot_trisurf(Xs, Ys, Zs, cmap=cm.jet, linewidth=0)
fig.colorbar(surf)

ax.xaxis.set_major_locator(MaxNLocator(5))
ax.yaxis.set_major_locator(MaxNLocator(6))
ax.zaxis.set_major_locator(MaxNLocator(5))

fig.tight_layout()
plt.show()

test.xyz文件包含38010个点。它的某些部分显示如下,可以找到完整的文件here

512743.63 5403547.33 308.68
512743.62 5403547.33 308.70
512743.61 5403547.33 308.72
512743.60 5403547.34 308.68
512743.60 5403547.33 308.73
512741.50 5403547.36 309.05
512741.50 5403547.36 309.07
512741.49 5403547.46 309.09
512741.48 5403547.46 309.07
512741.47 5403547.46 309.10
512741.47 5403547.45 309.13
512741.46 5403547.37 309.04
512739.39 5403547.51 309.10
512739.39 5403547.48 309.34
512739.38 5403547.60 309.25
512739.37 5403547.71 309.15
512739.39 5403547.49 310.65
512739.39 5403547.48 310.70
512739.38 5403547.49 310.69
512739.37 5403547.48 310.72
512739.36 5403547.39 310.64
512739.32 5403547.41 309.20
512737.33 5403547.26 313.14
512737.33 5403547.37 313.09
512737.32 5403547.38 313.03
512737.30 5403547.37 313.12
512737.30 5403547.26 313.14
512735.22 5403547.41 311.72
512735.22 5403547.43 312.29
512735.22 5403547.49 312.59
512735.21 5403547.51 312.48
512735.20 5403547.60 312.53
512735.19 5403547.61 312.48
512735.18 5403547.72 312.40
512735.18 5403547.71 312.49
512735.17 5403547.71 312.51
512735.16 5403547.70 312.58
512735.15 5403547.61 312.52

更新后,结果显示为:]

我认为这是错误的,因为我提供了足够的点来生成TIN,但结果似乎只使用了一小部分。在更新matplotlib之前,我可以得到如下结果:  ]

1 个答案:

答案 0 :(得分:0)

非常感谢所有回复。此问题已得到解决,详细信息显示在Problem about plot_trisurf of matplotlib 2.0.2中。 在这里,我很高兴能够展示我的成绩。 在计算qhull中的Delaunay三角剖分时,问题是有限精度问题,该问题考虑了接近的点(根据单词'near'的复杂定义)是相同的,因此三角测量比期望的更简单。对于有限精度,数据集是极端的(以坏的方式),因为关于它们的平均值的点的扩展很小(x.mean()= 512767,x.max() - x.min()= 134,y .mean()= 303,y.max() - y.min()= 5403707)。这由Ian Thomas解释。 因此,我更正了我的测试代码如下:

import sys
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
import numpy
from numpy.random import randn
from scipy import array, newaxis

chunk = numpy.loadtxt('test.xyz')  #test.xyz contains 38010 points,
DATA=numpy.array(chunk)
Xs = DATA[:,0]
Ys = DATA[:,1]
Zs = DATA[:,2]

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
#surf = ax.plot_trisurf(Xs, Ys, Zs, cmap=cm.jet, linewidth=0)
surf = ax.plot_trisurf(Xs-Xs.mean(), Ys-Ys.mean(), Zs, cmap=cm.jet, linewidth=0)
fig.colorbar(surf)

ax.xaxis.set_major_locator(MaxNLocator(5))
ax.yaxis.set_major_locator(MaxNLocator(6))
ax.zaxis.set_major_locator(MaxNLocator(5))

fig.tight_layout()
plt.show()

之前,结果显示为: enter image description here

之后,结果显示为: enter image description here

总而言之,这实际上并不是不同matplotlib版本之间的问题,而且当前版本足以应对大多数用例。如果有人希望可以轻松纠正轴刻度线,可以参考ImportanceOfBeingErnest的method.