如何为z轴设置最大值?

29 投票
3 回答
54378 浏览
提问于 2025-04-16 11:20

我正在尝试制作一个三维表面图,表达式是: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 个回答

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)
7

裁剪你的数据可以实现这个效果,不过看起来不是很好。

z[z>4]= np.nan
z[z<-4]= np.nan
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()

撰写回答