【问题标题】:Python/matplotlib mplot3d- how do I set a maximum value for the z-axis?Python/matplotlib mplot3d-如何设置 z 轴的最大值?
【发布时间】:2021-03-25 04:15:21
【问题描述】:

我正在尝试为表达式制作一个 3 维曲面图: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()

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    我遇到了同样的问题,但仍然没有找到比剪裁数据更好的方法。不幸的是,就我而言,我与 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()
    

    【讨论】:

    • 你能确认 set_zlim 对你有用吗?我使用的是 1.3.1,当我使用 set_zlimset_zlim3d 时,它只是限制了轴,但实际上并没有裁剪数据。
    • 你能解释一下如何使用set_zlim吗?
    【解决方案2】:

    剪裁你的数据可以实现这一点,但它不是很漂亮。

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

    【讨论】:

    • 没有更好的方法吗?在查看绘图时以某种方式“切除” [-4,4] 范围之外的 z 值?
    • @user605243:原则上,您应该能够使用 masked_array,就像使用 2D 绘图一样。在实践中它似乎不起作用(尽管在 axes3d.py 中进行必要的更改以使其看起来并不令人生畏。)不幸的是,我实际上无法获得 np.nan 技巧也可以工作,有很多“CGPathCloseSubpath:没有当前点”。错误。
    【解决方案3】:

    我发现ax.plot_trisurf 工作得很好,而不是使用ax.plot_surface,因为你不需要像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)
    

    【讨论】:

      猜你喜欢
      • 2014-08-11
      • 2015-07-25
      • 2015-05-13
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 2018-01-13
      相关资源
      最近更新 更多