Python Matplotlib 3DPlot尺寸不相等时的额外线
以MWE为例:Python Matplotlib 3DPlot尺寸不相等时的额外线,python,matplotlib,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 xr
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
不相等。由此产生的情节有一些奇怪的线条,以及奇怪的颜色:
这里发生了什么,我该如何防止这种情况?与2D不同,matplotlib中的3D绘图有很多问题。让我引用matplotlib常见问题解答中的一个答案: 这可能是mplot3d最常见的问题。这个 问题是——从某些视角看——会出现一个3D对象 在另一个物体前面,即使它在物体后面。 这可能导致绘图看起来“物理上不正确” 不幸的是,虽然一些工作正在做,以减少发生 对于这一人工制品,它目前是一个棘手的问题,无法解决 直到matplotlib在其初始阶段支持三维图形渲染,才能完全解决此问题 核心 该问题是由于将三维数据缩减为二维数据而产生的+ z阶标量。单个值表示所有对象的第三维 集合中三维对象的一部分。因此,当边界 两个集合的框相交,这就成为可能 要发生的伪影。此外,两个三维对象的交点 无法在中正确渲染(例如多边形或面片) 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仍然不支持Python 3。就我个人而言,如果您需要快速处理,我会推荐。对于样本数量而言,
15
和12
不是真的很低吗?就像你做了n=150;m=120
它似乎显示正确,我认为它只是极低细节的3d形状没有正确显示,因为。。。这是不够详细的。