2011-02-06 2 views
11

Я пытаюсь сделать 3-мерный поверхностный график для выражения: z = y^2/x, для x в интервале [-2,2] и y в интервале [-1,4,1,4]. Я также хочу, чтобы значения z находились в диапазоне от -4 до 4.Python/matplotlib mplot3d- как установить максимальное значение для оси z?

Проблема в том, что когда я просматриваю готовый график поверхности, значения оси 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

отсечение ваши данные будут сделать это, но это не очень красиво.

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

Есть ли лучший способ сделать это? Как-то «вырезать» значения z вне диапазона [-4,4] при просмотре графика? – user605243

+0

@ user605243: в принципе вы должны иметь возможность использовать masked_array, как вы можете с 2D-графиками. На практике это, похоже, не работает (хотя необходимые изменения в axes3d.py, чтобы заставить его не казаться _too_ устрашающим.) К сожалению, я не смог заставить тпк np.nan работать либо с большим количеством " CGPathCloseSubpath: нет текущей точки. " ошибки. – DSM

9

У меня такая же проблема, и я все еще не нашел ничего лучше, чем отсечение моих данных. К сожалению, в моем случае я привязан к matplotlib 1.2.1. Но в случае, если вы можете перейти на версию 1.3.0, у вас может быть решение: похоже, есть новая группа API, относящаяся к диапазонам осей. В частности, вас может заинтересовать «set_zlim».

Редактировать 1: Управлять миграцией моей среды для использования matplotlib 1.3.0; set_zlim работал как шарм :)

follwing код работал для меня (Кстати, я бегу это на 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

Можете ли вы подтвердить, что set_zlim работает для вас? Я использую 1.3.1, и когда я 'set_zlim' или' set_zlim3d', он просто ограничивает оси, но фактически не обрезает данные. – KobeJohn

+1

Не могли бы вы объяснить, как использовать set_zlim? – Jonny

+0

@ Jonny: http://matplotlib.org/mpl_toolkits/mplot3d/api.html#mpl_toolkits.mplot3d.axes3d.Axes3D.set_zlim – TocToc