Python/matplotlib mplot3d- как установить максимальное значение для оси z?
Я пытаюсь сделать трехмерный поверхностный график для выражения: z = y ^ 2/x, для x в интервале [-2,2] и y в интервале [-1,4,1,4]. Я также хочу, чтобы значения z находились в диапазоне от -4 до 4.
Проблема заключается в том, что когда я просматриваю готовый график поверхности, значения оси z не останавливаются на [-4,4].
Итак, мой вопрос заключается в том, как я могу "удалить" значение z-оси, которое находится вне интервала [-4,4] из готового графика?
Мой код:
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
У меня такая же проблема, и я все еще не нашел ничего лучше, чем отсечение моих данных. К сожалению, в моем случае я привязан к 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()
Ответ 2
отсечение ваших данных выполнит это, но это не очень красиво.
z[z>4]= np.nan
z[z<-4]= np.nan