旋转 3D 曲面图时散点消失

问题描述 投票:0回答:2
我试图通过绘制所有内容并旋转表面来检查表面行为相对于 3d 空间中的散点是否存在任何奇怪现象,从而了解表面与我的数据点的拟合程度。

问题是,当我旋转渲染来执行此操作时,绘图会消失。我怎样才能让情节持续下去?

enter image description here

您可以使用以下代码进行重现 - 主要取自

Python 3D多项式表面拟合,顺序相关中的惊人答案。

import numpy as np import scipy.linalg import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import itertools def main(): # Generate Data... numdata = 100 x = np.random.random(numdata) y = np.random.random(numdata) z = x**2 + y**2 + 3*x**3 + y + np.random.random(numdata) # Fit a 3rd order, 2d polynomial m = polyfit2d(x,y,z) # Evaluate it on a grid... nx, ny = 20, 20 xx, yy = np.meshgrid(np.linspace(x.min(), x.max(), nx), np.linspace(y.min(), y.max(), ny)) zz = polyval2d(xx, yy, m) # Plot #plt.imshow(zz, extent=(x.min(), y.max(), x.max(), y.min())) #plt.scatter(x, y, c=z) #plt.show() fig = plt.figure() ax = Axes3D(fig) ax.scatter(x, y, z, color='red', zorder=0) ax.plot_surface(xx, yy, zz, zorder=10) ax.set_xlabel('X data') ax.set_ylabel('Y data') ax.set_zlabel('Z data') plt.show() text = "filler" def polyfit2d(x, y, z, order=4): ncols = (order + 1)**2 G = np.zeros((x.size, ncols)) #ij = itertools.product(range(order+1), range(order+1)) ij = xy_powers(order) for k, (i,j) in enumerate(ij): G[:,k] = x**i * y**j m, _, _, _ = np.linalg.lstsq(G, z) return m def polyval2d(x, y, m): order = int(np.sqrt(len(m))) - 1 #ij = itertools.product(range(order+1), range(order+1)) ij = xy_powers(order) z = np.zeros_like(x) for a, (i,j) in zip(m, ij): z += a * x**i * y**j return z def xy_powers(order): powers = itertools.product(range(order + 1), range(order + 1)) return [tup for tup in powers if sum(tup) <= order] main()
    
python matplotlib 3d surface
2个回答
2
投票
您可以做的一个简单的事情是将表面的透明度设置为低于散点图的值。请参阅下面的示例,其中我使用等于 0.4 的透明度值和线

ax.plot_surface(xx, yy, zz, zorder=10,alpha=0.4)

输出给出:

enter image description here


0
投票
TLDR;一般情况下是不可能做到的,但不仅仅是(仅)设置透明度值 alpha(设置特定的 z 顺序)。

嗨,虽然这个问题相对较旧,但我想补充一点,这通常是 Matplotlib-3D 的一个已知问题(

GitHub-Issue)。但是还有一些一线希望,如果您不喜欢设置透明度值,您可以手动指定表面和点的 z 顺序 (Z-Order-Demo),详细信息请参阅 GitHub 问题(请参阅还合并了 Pull Request相关问题)。

由于您已经在代码中包含了 z 顺序参数,因此您可以显式指定 z 顺序,s.t.要点总是可见的:

# Draw scatter with higher zorder than surface ax.scatter(x, y, z, color='red', zorder=10) ax.plot_surface(xx, yy, zz, zorder=0)
如果您只想看到一小部分点,根据它们的自然可见性,您需要手动计算这些点是否可见,然后将可见点的 z 顺序设置得更高。
请注意,一般来说,正确实现这可能需要相当多的工作,但某些边缘情况可能更容易实现。

© www.soinside.com 2019 - 2024. All rights reserved.