Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Matplotlib 3DPlot尺寸不相等时的额外线_Python_Matplotlib - Fatal编程技术网

Python Matplotlib 3DPlot尺寸不相等时的额外线

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

以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
不相等。由此产生的情节有一些奇怪的线条,以及奇怪的颜色:


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

与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形状没有正确显示,因为。。。这是不够详细的。