考虑这个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()
请特别注意尺寸n
和m
不相等。由此产生的情节有一些奇怪的线条垂下来,以及奇怪的颜色:
这里发生了什么,我该如何防止这种情况?
答案 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()
,结果如下:
上面的示例给出了rstrides和cstrides值为10.如果你增加太多(假设为80)并且问题变得明显:
其他选项是您遵循matplotlib FAQ本身的建议并检查Mayavi。但请注意,mayavi仍然不支持Python 3.就个人而言,如果您需要快速使用的东西,我建议PyQtGraph。