2011-02-06 9 views
11

मैं अभिव्यक्ति के लिए 3-आयामी सतह साजिश बनाने की कोशिश कर रहा हूं: z = y^2/x, अंतराल में x के लिए [-2,2] और y अंतराल में [-1.4,1.4]। मैं यह भी चाहता हूं कि जेड-वैल्यू -4 से 4 तक हो।पायथन/matplotlib mplot3d- मैं z-axis के लिए अधिकतम मान कैसे निर्धारित करूं?

समस्या यह है कि जब मैं समाप्त सतहप्लॉट देख रहा हूं, तो z-axis मान [-4,4] पर नहीं रुकते हैं।

तो मेरा सवाल यह है कि मैं जेड-अक्ष मान को "हटा" सकता हूं जो कि समाप्त साजिश से अंतराल [-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

वहाँ कोई बेहतर तरीका है यह करने के लिए? साजिश को देखते समय [-4,4] की सीमा के बाहर जेड-वैल्यू को "कट" करने के लिए? – user605243

+0

@ user605243: सिद्धांत रूप में, आप एक masked_array का उपयोग करने में सक्षम होना चाहिए, जैसे आप 2 डी प्लॉट के साथ कर सकते हैं। प्रैक्टिस में यह काम नहीं कर रहा है (हालांकि axes3d.py में आवश्यक परिवर्तन _too_ daunting प्रतीत नहीं होता है।) दुर्भाग्य से मैं वास्तव में काम करने के लिए np.nan चाल नहीं प्राप्त कर सकता था, जिसमें बहुत से " CGPathCloseSubpath: कोई वर्तमान बिंदु नहीं। " त्रुटियों। – DSM

9

मुझे एक ही समस्या है और अभी भी मेरे डेटा को क्लिप करने से बेहतर कुछ नहीं मिला है। दुर्भाग्य से मेरे मामले में मैं matplotlib 1.2.1 से जुड़ा हुआ हूँ। लेकिन यदि आप संस्करण 1.3.0 में अपग्रेड कर सकते हैं तो आपके पास समाधान हो सकता है: ऐसा लगता है कि axes श्रेणियों से संबंधित नए 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

@ जॉनी: http://matplotlib.org/mpl_toolkits/mplot3d/api.html#mpl_toolkits.mplot3d.axes3d.Axes3D.set_zlim – TocToc

संबंधित मुद्दे