2011-02-06 304 views
11

我想为表达式做一个三维曲面图:z = y^2/x,对于区间[-2,2]中的x和区间[-1.4,1.4]中的y。我还希望Z值范围从-4到4.Python/matplotlib mplot3d-如何为z轴设置最大值?

问题是,当我查看完成的曲面图时,z轴值不停在[-4,4]处。

所以我的问题是如何从完成的图中“移除”在intervall [-4,4]之外的z轴值?

我的代码是:

from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = fig.gca(projection="3d") 

x = np.arange(-2.0,2.0,0.1,float)  # x in interval [-2,2] 
y = np.arange(-1.4,1.4,0.1,float)  # y in interval [-1.4,1.4] 
x,y = np.meshgrid(x,y) 
z = (y**2/x)       # z = y^2/x 

ax.plot_surface(x, y, z,rstride=1, cstride=1, linewidth=0.25) 

ax.set_zlim3d(-4, 4)     # viewrange for z-axis should be [-4,4] 
ax.set_ylim3d(-2, 2)     # viewrange for y-axis should be [-2,2] 
ax.set_xlim3d(-2, 2)     # viewrange for x-axis should be [-2,2] 
plt.show() 

回答

1

裁剪您的数据将做到这一点,但它是不是很漂亮。

z[z>4]= np.nan 
z[z<-4]= np.nan 
+0

有没有更好的办法去做这个?在查看图表时,以某种方式“切除”[-4,4]范围之外的z值? – user605243 2011-02-06 15:28:15

+0

@ user605243:原则上,您应该可以使用masked_array,就像使用2D图一样。在实践中,它似乎并不奏效(虽然在axes3d.py中进行必要的更改让它看起来并不令人畏惧)。不幸的是,我实际上无法让np.nan技巧工作,但有很多“ CGPathCloseSubpath:没有当前点。“错误。 – DSM 2011-02-06 15:54:43

9

我有同样的问题,仍然没有找到比削减我的数据更好的东西。不幸的是,在我的情况下,我被绑定到matplotlib 1.2.1。但是,如果您可以升级到1.3.0版本,您可以有一个解决方案:似乎有很多与轴范围有关的新的API。特别是,您可能会对“set_zlim”感兴趣。

编辑1:管理迁移我的环境以使用matplotlib 1.3.0; set_zlim工作就像一个魅力:)

的follwing代码为我工作(通过我在OSX上运行此顺便说一下,我不知道这有什么影响?):

# ---------------------------------------------------------------------------- 
# Make a 3d plot according to data passed as arguments 
def Plot3DMap(self, LabelX, XRange, LabelY, YRange, LabelZ, data3d) : 
    fig = plt.figure() 
    ax = fig.add_subplot(111, projection="3d") 
    xs, ys = np.meshgrid(XRange, YRange) 
    surf = ax.plot_surface(xs, ys, data3d) 
    ax.set_xlabel(LabelX) 
    ax.set_ylabel(LabelY) 
    ax.set_zlabel(LabelZ) 
    ax.set_zlim(0, 100) 
    plt.show() 
相关问题