【问题标题】:Graphical errors plotting 3d polygons in python在 python 中绘制 3d 多边形的图形错误
【发布时间】:2021-02-17 12:30:13
【问题描述】:

我在 3D 中使用 matplotlib 绘制多边形时遇到问题。在某些情况下,似乎总是会出现某种图形错误,其中显示的多边形被其他多边形覆盖。这导致了一些非常奇怪的锁定图。但我不知道我在代码中哪里出错了。也许你们中的一些人之前遇到过问题并且已经有了解决方案。我的示例代码如下:

from mpl_toolkits.mplot3d import Axes3D       
from mpl_toolkits.mplot3d.art3d import Poly3DCollection                                 
import matplotlib.pyplot as plt                                                         
import numpy as np                                                                      
                                                                                          
                                                                                          
z = np.zeros((10,10))                                                                   
z[5,5] = 5                                                                              
z[4,5] = 2                                                                              
z[4,4] = 2.8                                                                            
                                                                                          
nx,ny = (10,10)                                                                         
xv = np.linspace(0,9,nx)                                                                
yv = np.linspace(0,9,ny)                                                                
x,y = np.meshgrid(xv,yv)                                                                
y = np.flipud(y)                                                                        
                                                                                          
                                                                                          
fig = plt.figure()                                                                      
ax = Axes3D(fig)                                                                        
ax.set_xlim3d(np.min(np.array(x)),np.max(np.array(x)))
ax.set_ylim3d(np.min(np.array(y)),np.max(np.array(y)))                                                                     
ax.set_zlim3d(np.min(np.array(z)),np.max(np.array(z)))                                  
ax.view_init(elev=45,azim=0)                                                            
ax.xaxis.set_pane_color((1.0, 1.0, 1.0, 0.0))                                           
ax.yaxis.set_pane_color((1.0, 1.0, 1.0, 0.0))                                           
ax.zaxis.set_pane_color((1.0, 1.0, 1.0, 0.0))                                           
ax.xaxis._axinfo["grid"]['color'] =  (1,1,1,0)                                          
ax.yaxis._axinfo["grid"]['color'] =  (1,1,1,0)                                          
ax.zaxis._axinfo["grid"]['color'] =  (1,1,1,0)                                          
ax.set_axis_off()                                                                       
                                                                                          
for d1 in range(ny-1):                                                                  
    for d2 in range(nx-1):                                                              
        xp = [x[d1,d2],x[d1+1,d2],x[d1,d2+1]]
        yp = [y[d1,d2],y[d1+1,d2],y[d1,d2+1]]                                                                                                     
        zp = [z[d1,d2],z[d1+1,d2],z[d1,d2+1]]                                           
        verts = [list(zip(xp,yp,zp))]                                                   
        ax.add_collection3d(Poly3DCollection(verts,facecolor='mediumblue',              
                                  linewidths=1,edgecolor='black'))                      
        xp = [x[d1+1,d2],x[d1+1,d2+1],x[d1,d2+1]]                                       
        yp = [y[d1+1,d2],y[d1+1,d2+1],y[d1,d2+1]]                                       
        zp = [z[d1+1,d2],z[d1+1,d2+1],z[d1,d2+1]]                                       
        verts = [list(zip(xp,yp,zp))]                                                   
        tri = ax.add_collection3d(Poly3DCollection(verts,facecolor='goldenrod',         
                                  linewidths=1,edgecolor='black'))                      
                                                                                          
plt.savefig('out.png') 

可以在这里看到一个显示问题的图,看看左边的第 6 列,靠近图的中间。这些错误似乎与角度有关,在其他方位角中不会发生此错误。但是改变方位角不是解决方案,因为这样的错误可能发生在其他位置。有人知道我做错了什么以及如何做对吗?

【问题讨论】:

    标签: python matplotlib 3d polygon


    【解决方案1】:

    如果你旋转,你会发现不一致的深度渲染是问题:

    不幸的是,这是一个已知问题,甚至在 Matplotlib FAQ 中得到了解决:

    我的 3D 绘图在某些视角下看起来不正确 这是 可能是 mplot3d 最常报告的问题。问题是 从某些角度来看,一个 3D 对象会出现在 另一个对象,即使它在物理上位于它后面。这个可以 导致绘图看起来“物理上不正确”。

    不幸的是,虽然正在做一些工作以减少这种情况的发生 这个神器,目前是个棘手的问题,不能 完全解决,直到 matplotlib 支持 3D 图形渲染 核心。

    如果您继续阅读,他们的官方建议是暂时使用Mayavi。如果您需要更大的灵活性,最好遵循此建议。否则,您可能不得不坚持某些可行的角度。

    【讨论】:

    • 感谢您提供如此快速且令人惊讶的好答案 :) 我仍然担心它是这样的。只使用特定的角度不是一种选择,因为我想用更多的多边形来绘制地形。所以在每一个可能的角度都会出现这样的问题。
    猜你喜欢
    • 1970-01-01
    • 2017-12-07
    • 2023-04-01
    • 2016-02-10
    • 2015-10-03
    • 2012-03-19
    • 1970-01-01
    • 2019-11-30
    • 2010-09-30
    相关资源
    最近更新 更多