【问题标题】:Python matplotlib wireframe distortionPython matplotlib 线框失真
【发布时间】:2012-08-31 01:59:33
【问题描述】:

我正在尝试使用 matplotlib 创建一个由多个线框球体组成的图。我找到了一个代码片段来绘制一个这样的球体here,所以我认为只需多次调用 plot_wireframe 就可以轻松地将其扩展到多个球体。我错了。这是一个代码片段:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
u, v = np.mgrid[0:2*np.pi:20j, 0:np.pi:10j]
x=np.cos(u)*np.sin(v)
y=np.sin(u)*np.sin(v)
z=np.cos(v)
fig = plt.figure(figsize=(8,6))
ax = fig.gca(projection='3d')
ax.plot_wireframe(x*3.+5., y*3., z*3.,linewidths=.2)
ax.view_init(azim=30,elev=40)
ax.set_aspect("equal")
plt.show()
fig = plt.figure(figsize=(8,6))
ax = fig.gca(projection='3d')
ax.plot_wireframe(x*3.+5., y*3., z*3.,linewidths=.2)
spheres = [ [0,0,0,1], [3,0,0,1.6] ]
for v in spheres:
    ax.plot_wireframe(x*v[3]+v[0], y*v[3]+v[1], z*v[3]+v[2],linewidths=.2)
ax.view_init(azim=30,elev=40)
ax.set_aspect("equal")
plt.show()

如果您运行该代码,第一个图将显示一个漂亮的球体,而在第二个图中,所有球体都被扭曲和移动。我搜索以确保可以在同一轴上多次调用 plot_wireframe 但找不到任何东西。另外,我是 Python 新手,但我不认为我做错了什么。 感谢您的帮助!

【问题讨论】:

    标签: python matplotlib plot geometry wireframe


    【解决方案1】:

    简答:手动调整坐标轴范围:

    import matplotlib.pyplot as plt
    import numpy as np
    from mpl_toolkits.mplot3d import Axes3D
    u, v = np.mgrid[0:2*np.pi:20j, 0:np.pi:10j]
    x=np.cos(u)*np.sin(v)
    y=np.sin(u)*np.sin(v)
    z=np.cos(v)
    
    # I'm not sure what was this for.  
    '''
    fig = plt.figure(figsize=(8,6))
    ax = fig.gca(projection='3d')
    ax.plot_wireframe(x*3.+5., y*3., z*3.,linewidths=.2)
    ax.view_init(azim=30,elev=40)
    ax.set_aspect("equal")
    
    plt.show()
    '''
    
    fig = plt.figure(figsize=(8,6))
    ax = fig.gca(projection='3d')
    
    
    ax.plot_wireframe(x*3.+5., y*3., z*3.,linewidths=.2)
    spheres = [ [0,0,0,1], [3,0,0,1.6] ]
    for v in spheres:
        ax.plot_wireframe(x*v[3]+v[0], y*v[3]+v[1], z*v[3]+v[2],linewidths=.2)
    ax.view_init(azim=30,elev=40)
    
    ax.set_xlim([0,7])   # Like so. 
    ax.set_ylim([-3,3]) 
    ax.set_zlim([-3,3]) 
    
    ax.set_aspect("equal")
    plt.show()
    

    【讨论】:

    • 第一个图是显示代码在一个球体上运行良好。这太棒了,虽然我不确定它为什么会起作用,你能解释一下与 x,y,z 限制的联系吗?谢谢!
    • 更多 cmets:它仍然失真。设置限制显然与设置相等的纵横比相冲突(只需尝试将 xlim 设置为 -10 10)。我尝试使用 ax.set_aspect('equal', 'datalim') 但是如果我单击并拖动它会搞砸。有bug吗?
    猜你喜欢
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    相关资源
    最近更新 更多