如何为z轴设置最大值?

29

我正在尝试制作一个三维表面图,表达式为:z = y^2/x,其中x在区间[-2,2],y在区间[-1.4,1.4]。我还希望z值的范围从-4到4。

问题是,当我查看完成的表面图时,z轴值并没有停留在[-4,4]。

所以我的问题是如何从完成的图中“删除”超出区间[-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()
3个回答

22
我有同样的问题,还没找到比剪辑数据更好的解决办法。不幸的是,在我的情况下,我被绑定在matplotlib 1.2.1上。但是,如果你升级到版本1.3.0,你可能会有一个解决方案:似乎有一堆新的与轴范围相关的API。特别是,你可能会对“set_zlim”感兴趣。
编辑1:设法将我的环境迁移到使用matplotlib 1.3.0; set_zlim像魔术般起作用了 :)
以下代码适用于我(顺便说一句,我在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()

10
你能否确认 set_zlim 对你有效?我使用的是1.3.1版本,当我使用 set_zlimset_zlim3d 函数时,它只是限制了坐标轴的范围,但实际上并没有截断数据。 - KobeJohn
1
请问您能否解释一下如何使用set_zlim函数? - Jonny
1
@Jonny:http://matplotlib.org/mpl_toolkits/mplot3d/api.html#mpl_toolkits.mplot3d.axes3d.Axes3D.set_zlim - TocToc

7

裁剪数据可以实现此目的,但并不美观。

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

有没有更好的方法来做这件事?在查看图形时,是否有一种方法可以“削减”范围在[-4,4]之外的z值? - user605243
@user605243:原则上,您应该能够像使用2D图一样使用masked_array。但实际上似乎不起作用(尽管在axes3d.py中进行必要的更改似乎并不是太困难)。不幸的是,我也无法让np.nan技巧起作用,出现了大量“CGPathCloseSubpath: no current point.”错误。 - DSM

3

与其使用ax.plot_surface,我发现ax.plot_trisurf的效果很好,因为不需要像ax.plot_surface一样提供一个矩形的数值网格。如果您在使用NumPy数组,则可以使用以下技巧仅选择在z边界内的点。

from matplotlib import cm

x, y, z = x.flatten(), y.flatten(), z.flatten()
usable_points = (-4 < z) & (z < 4)
x, y, z = x[usable_points], y[usable_points], z[usable_points]
ax.plot_trisurf(x, y, z, cmap=cm.jet)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接