当尺寸不相等时,Matplotlib 3DPlot额外线条

时间:2016-05-27 16:31:09

标签: python matplotlib

考虑这个MWE:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from matplotlib import cm

n = 15
m = 12

x = np.linspace(-5, 5, n)
y = np.linspace(-5, 5, m)

Z = np.zeros((m, n))
for i in xrange(m):
    for j in xrange(n):
        Z[i, j] = x[j]**2 + y[i]**2


### Plot surface ###
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y = np.meshgrid(x, y)
ax.plot_surface(X, Y, Z)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('Z')
plt.show()

请特别注意尺寸nm不相等。由此产生的情节有一些奇怪的线条垂下来,以及奇怪的颜色:plot

这里发生了什么,我该如何防止这种情况?

1 个答案:

答案 0 :(得分:2)

与2D不同,matplotlib中的3D绘图有很多shortcomings。让我引用matplotlib FAQ中的一个答案:

  

这可能是mplot3d最常报道的问题。该   问题在于 - 从某些视角 - 会出现3D物体   在另一个物体的前面,即使它在身体后面。   这可能会导致图形看起来“物理上不正确”。

     

不幸的是,虽然正在做一些工作来减少事故的发生   这个神器,它目前是一个棘手的问题,而不是   完全解决,直到matplotlib支持3D图形渲染   芯

     

由于3D数据减少到2D +而出现问题   z阶标量。单个值表示所有人的第三维   集合中3D对象的一部分。因此,当边界   两个集合的盒子相交,这就成了可能   工件发生。此外,两个3D对象的交集   (如多边形或补丁)无法正确渲染   matplotlib的2D渲染引擎。

     

在添加OpenGL支持之前,此问题可能无法解决   对所有后端(非常欢迎补丁)。在那之前,如果   如果您需要复杂的3D场景,我们建议您使用MayaVi。

对于你的特殊问题(并且注意到我不认为这与每个方向上的不同尺寸有任何关系)我会建议你增加你的表面形状(即使是人为的)并且玩弄步数直到你获得满意的东西:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from matplotlib import cm

n = 150
m = 120

x = np.linspace(-5, 5, n)
y = np.linspace(-5, 5, m)

Z = np.zeros((m, n))
for i in range(m):
    for j in range(n):
        Z[i, j] = x[j]**2 + y[i]**2


### Plot surface ###
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y = np.meshgrid(x, y)
ax.plot_surface(X, Y, Z,rstride=1, cstride=1)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('Z')
plt.show()

,结果如下:

Matplotlib surface with rstrides and cstrides == 10

上面的示例给出了rstrides和cstrides值为10.如果你增加太多(假设为80)并且问题变得明显:

Matplotlib surface with rstrides and cstrides == 80

其他选项是您遵循matplotlib FAQ本身的建议并检查Mayavi。但请注意,mayavi仍然不支持Python 3.就个人而言,如果您需要快速使用的东西,我建议PyQtGraph