कैसे अजगर / matplotlib का उपयोग कर 3 डी भूखंडों के लिए "कैमरा स्थिति" सेट करने के लिए?


134

मैं 3 डी डेटा के अच्छे भूखंडों का उत्पादन करने के लिए mplot3d का उपयोग करना सीख रहा हूं और अब तक बहुत खुश हूं। फिलहाल मैं जो करने की कोशिश कर रहा हूं वह एक घूमती हुई सतह का थोड़ा सा एनीमेशन है। उस उद्देश्य के लिए, मुझे 3 डी प्रक्षेपण के लिए एक कैमरा स्थिति निर्धारित करने की आवश्यकता है। मुझे लगता है कि यह संभव होना चाहिए क्योंकि एक सतह को माउस का उपयोग करके घुमाया जा सकता है जब matplotlib का उपयोग अंतःक्रियात्मक रूप से किया जाता है। लेकिन मैं इसे एक स्क्रिप्ट से कैसे कर सकता हूं? मुझे mpl_toolkits.mplot3d.proj3d में बहुत सारे ट्रांसफ़ॉर्म मिले, लेकिन मुझे यह पता नहीं चला कि मैं अपने उद्देश्य के लिए इनका उपयोग कैसे करूँ और मुझे कोई उदाहरण नहीं मिला कि मैं क्या करने की कोशिश कर रहा हूँ।


2
जुपिटर नोटबुक में अंतःक्रियात्मक रूप से घुमाने के लिए सोच रहे लोगों के लिए साइड नोट: आप उपयोग कर सकते हैं%matplotlib notebook
YvesgereY

सही माउस बटन को पकड़ते समय खींचने से कैमरा की दूरी बदल जाती है।
LoMaPh

इस तरह के वशीकरण के लिए, मैं मायावी को एक कोशिश दूंगा।
Tactopoda

जवाबों:


158

"कैमरा पोज़िशन" से, ऐसा लगता है कि आप ऊँचाई और अज़िमुथ कोण को समायोजित करना चाहते हैं जिसका उपयोग आप 3D प्लॉट को देखने के लिए करते हैं। आप इसके साथ सेट कर सकते हैं ax.view_init। मैंने प्लॉट बनाने के लिए नीचे की स्क्रिप्ट का उपयोग किया है, फिर मैंने एक अच्छी ऊंचाई निर्धारित की, या elev, जिसमें से मेरा प्लॉट देखने के लिए। फिर मैंने azimअपने प्लॉट के चारों ओर पूर्ण 360dg को अलग करने के लिए azimuth कोण को समायोजित किया, या प्रत्येक उदाहरण पर आंकड़ा सहेजा (और ध्यान दें कि जो azimuth कोण मैंने प्लॉट को बचाया था)। एक अधिक जटिल कैमरा पैन के लिए, आप वांछित प्रभाव को प्राप्त करने के लिए ऊंचाई और कोण दोनों को समायोजित कर सकते हैं।

    from mpl_toolkits.mplot3d import Axes3D
    ax = Axes3D(fig)
    ax.scatter(xx,yy,zz, marker='o', s=20, c="goldenrod", alpha=0.6)
    for ii in xrange(0,360,1):
        ax.view_init(elev=10., azim=ii)
        savefig("movie%d.png" % ii)

26
मुझे इससे हराएं! एक साइड नोट पर, ये ax.elevऔर ax.azimगुण के रूप में उपलब्ध हैं। आप केवल एक ही प्रभाव को प्राप्त करने के लिए ax.azim = iiभी लिख सकते हैं ax.azim += 1
जो किंग्सटन

1
क्षमा करें, मैं आपको हराता हूं, लेकिन चारों ओर उचित बिंदु। यह भी सिर्फ मेरा एक कोडिंग अंश है, केवल for_init और savefig की तुलना में उस फॉर-लूप के भीतर अधिक था। =)
cosmosis

4
धन्यवाद ब्रह्मांड और जो, वह वही था जिसकी मुझे तलाश थी। चूंकि मुझे अब पता था कि क्या देखना है, इसलिए मैंने ax.dist को भी ढूंढ लिया - जो ax.azim और ax.elev के साथ मिलकर - ध्रुवीय निर्देशांक में कैमरा स्थिति सेट करने की अनुमति देता है।
एंड्रिया ब्ल्यूलर

यदि यह उत्तर है - क्या आप कृपया इसे चिह्नित कर सकते हैं? धन्यवाद।
ब्रह्माण्ड

12
आप ax.dist = 15 द्वारा कैमरा और ऑब्जेक्ट पॉइंट के बीच की दूरी भी तय कर सकते हैं (डिफ़ॉल्ट होना 10)
Tim

14

एक नए प्लॉट में कैमरा पोजिशन को लागू करना कितना आसान होगा। तो मैं साजिश करता हूं, फिर माउस को दूरी बदलने के साथ भूखंड को स्थानांतरित करें। फिर दूसरे भूखंड पर दूरी सहित दृश्य को दोहराने की कोशिश करें। मुझे लगता है कि axx.ax.get_axes () मुझे पुराने .azim और .elev के साथ एक ऑब्जेक्ट मिलता है।

अजगर में ...

axx=ax1.get_axes()
azm=axx.azim
ele=axx.elev
dst=axx.dist       # ALWAYS GIVES 10
#dst=ax1.axes.dist # ALWAYS GIVES 10
#dst=ax1.dist      # ALWAYS GIVES 10

बाद में 3 डी ग्राफ ...

ax2.view_init(elev=ele, azim=azm) #Works!
ax2.dist=dst                       # works but always 10 from axx

EDIT 1 ... ठीक है, कैमरा स्थिति .dist मान के विषय में सोचने का गलत तरीका है। यह पूरे ग्राफ़ के लिए एक तरह के हैके स्केलर मल्टीप्लायर के रूप में सब कुछ के ऊपर सवार है।

यह दृश्य के आवर्धन / ज़ूम के लिए काम करता है:

xlm=ax1.get_xlim3d() #These are two tupples
ylm=ax1.get_ylim3d() #we use them in the next
zlm=ax1.get_zlim3d() #graph to reproduce the magnification from mousing
axx=ax1.get_axes()
azm=axx.azim
ele=axx.elev

बाद में ग्राफ़ ...

ax2.view_init(elev=ele, azim=azm) #Reproduce view
ax2.set_xlim3d(xlm[0],xlm[1])     #Reproduce magnification
ax2.set_ylim3d(ylm[0],ylm[1])     #...
ax2.set_zlim3d(zlm[0],zlm[1])     #...

हैकी स्केलर गुणक को कॉल करने के लिए +1। यदि आप परिप्रेक्ष्य की उम्मीद कर रहे हैं तो यह बहुत कष्टप्रद है।
user5920660
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.