2016-01-29 3 views
6

जब this example में क्विवर का उपयोग 3 डी में किया जाता है तो यह केवल सभी तीर की लंबाई निर्धारित करना संभव है। यह प्रदान किए गए तीरों की वास्तविक लंबाई को प्रतिबिंबित नहीं करता है।पाइथन matplotlib में सही ढंग से 3 डी क्विवर आरेखों को कैसे स्केल करें?

तर्कसंगत पैमाने, जो कि 2 डी मामले में काम करता है, यहां काम नहीं लगता है।

क्या तीरों को स्केल करने का कोई तरीका है जैसे कि उनकी लंबाई दिए गए वेक्टर फ़ील्ड की लंबाई को दर्शाती है?

उत्तर

2

यह अजीब है देखो। ऐसा लगता है कि आप, वी, डब्ल्यू बस दिशा स्थापित करते हैं, और लंबाई पैरामीटर सभी लंबाई समान प्रभाव डालता है। आप लंबाई पैरामीटर में सरणी नहीं डाल सकते हैं। अपने अच्छी तरह से प्रलेखित कोड के लिए

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib 
import numpy as np 
import pylab as plt 

print(matplotlib.__version__) 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

x, y, z = np.meshgrid(np.arange(-1, 1, 0.4), 
         np.arange(-1, 1, 0.4), 
         np.arange(-1, 1, 0.4)) 
x = x.reshape(np.product(x.shape)) 
y = y.reshape(np.product(y.shape)) 
z = z.reshape(np.product(z.shape)) 

scale = 0.02 
u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z) 
v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z) 
w = np.sqrt(2.0/3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) * np.sin(np.pi * z) 
lengths = np.sqrt(x**2+y**2+z**2) 

for x1,y1,z1,u1,v1,w1,l in zip(x,y,z,u,v,w,lengths): 
    ax.quiver(x1, y1, z1, u1, v1, w1, pivot = 'middle', length=l*0.5) 

ax.scatter(x,y,z, color = 'black') 
plt.show() 

3d Quiver

+0

स्थापित नहीं कर सकता है प्रत्येक लंबाई अलग से सेट करें वास्तव में एक काम है- चारों ओर, लेकिन ऐसा लगता है ... उत्तर के लिए धन्यवाद! – SeF

2

बस दस्तावेज़ों के चारों ओर पोक http://matplotlib.org/mpl_toolkits/mplot3d/api.html यह आपके लिए काम करता है?

अभी भी स्पष्ट नहीं तीर लंबाई ठीक कह रहे हैं कि लेकिन कम से कम अब 3 डी

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib 
import numpy as np 

print(matplotlib.__version__) 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

x, y, z = np.meshgrid(np.arange(-1, 1, 0.4), 
         np.arange(-1, 1, 0.4), 
         np.arange(-1, 1, 0.4)) 
scale = 0.02 
u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z) 
v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z) 
w = np.sqrt(2.0/3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) * np.sin(np.pi * z) 

ax.quiver(x, y, z, u, v, w, pivot = 'middle', arrow_length_ratio = 0.02) 
ax.scatter(x,y,z, color = 'black') 
plt.show() 

enter image description here

+0

जवाब के लिए धन्यवाद, और:

चारों ओर एक विशिष्ट काम के रूप में, तुम सिर्फ प्रत्येक तीर अलग प्लॉट कर सकते हैं! तीरों की दिशा सही है लेकिन सामान्य रूप से उनकी लंबाई नहीं है। एक निरंतर समारोह यू के साथ प्रयास करें = 0.001 वी = 0.001 w = 0.001 और फिर यू के साथ = 1 v = 1 w = 1 लंबाई हमेशा एक ही है। – SeF

+0

बकाया के बारे में डॉ। ज़ोराइल के लिए 25 अंक और f5r5e5d के लिए 25 अंक होना चाहिए ... क्षमा करें मैं विभाजित नहीं कर सका! – SeF

+0

ऐसा लगता है कि यह matplotlib 2.0 में तय किया जाना चाहिए, जिसमें वर्तमान रिलीज उम्मीदवार और बीटा संस्करण है - हालांकि मैं उन्हें बनाने के लिए तैयार नहीं हूं, एक स्थापित पीकेजी – f5r5e5d

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