2011-02-06 40 views
11

Tôi đang cố tạo một ô bề mặt 3 chiều cho biểu thức: z = y^2/x, với x trong khoảng [-2,2] và y trong khoảng [-1,4,1,4]. Tôi cũng muốn các giá trị z nằm trong khoảng từ -4 đến 4.Python/matplotlib mplot3d- làm cách nào để đặt giá trị tối đa cho trục z?

Vấn đề là khi tôi xem surfaceplot hoàn thành, giá trị trục z không dừng ở [-4,4].

Vì vậy, câu hỏi của tôi là làm thế nào tôi có thể "loại bỏ" giá trị z-trục nằm ngoài phạm vi intervall [-4,4] từ cốt truyện đã hoàn thành?

Mã của tôi là:

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

Trả lời

1

cắt dữ liệu của bạn sẽ thực hiện điều này, nhưng nó không phải là rất khá.

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

Có không có cách nào tốt hơn để làm điều này? Bằng cách nào đó "cắt" đi các giá trị z bên ngoài phạm vi [-4,4] khi xem cốt truyện? – user605243

+0

@ user605243: về nguyên tắc, bạn sẽ có thể sử dụng masked_array, như bạn có thể làm với các ô 2D. Trong thực tế nó không có vẻ làm việc (mặc dù những thay đổi cần thiết trong axes3d.py để làm cho nó không có vẻ _too_ daunting.) Thật không may tôi thực sự không thể có được np.nan lừa để làm việc, hoặc, với rất nhiều " CGPathCloseSubpath: không có điểm hiện tại. " lỗi. – DSM

9

Tôi gặp vấn đề tương tự và vẫn chưa tìm thấy bất kỳ điều gì tốt hơn là cắt bớt dữ liệu của mình. Thật không may trong trường hợp của tôi tôi bị ràng buộc với matplotlib 1.2.1. Nhưng trong trường hợp bạn có thể nâng cấp lên phiên bản 1.3.0 bạn có thể có một giải pháp: có vẻ như có một bó mới API liên quan đến các dãy trục. Đặc biệt, bạn có thể quan tâm đến "set_zlim".

Chỉnh sửa 1: Quản lý để di chuyển môi trường của tôi để sử dụng matplotlib 1.3.0; set_zlim làm việc như một nét duyên dáng :)

Mã follwing làm việc cho tôi (Bằng cách này tôi đang chạy này trên OSX, tôi không chắc chắn điều này có ảnh hưởng?):

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

Bạn có thể xác nhận rằng set_zlim hoạt động cho bạn không? Tôi đang sử dụng 1.3.1 và khi tôi 'set_zlim' hoặc' set_zlim3d' nó chỉ giới hạn các trục nhưng không thực sự clip dữ liệu. – KobeJohn

+1

Bạn có thể giải thích cách sử dụng set_zlim không? – Jonny

+0

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

Các vấn đề liên quan