我试图为表达式制作一个三维曲面图:z = y ^ 2 / x,区间为[-2,2]的x,区间为[-1.4,1.4]的y。我还希望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()
答案 0 :(得分:11)
我遇到了同样的问题,但仍然没有找到比剪辑数据更好的东西。不幸的是,在我的情况下,我与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()
答案 1 :(得分:1)
剪辑你的数据会实现这一点,但它不是很漂亮。
z[z>4]= np.nan
z[z<-4]= np.nan
答案 2 :(得分:0)
我发现使用 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)