2012-06-21 20 views
51

मैं खोजता हूं कि मैटलप्लिब के साथ जितना संभव हो उतना कम निर्देश के साथ कुछ प्लॉट करना है, लेकिन मुझे दस्तावेज़ में इसके लिए कोई मदद नहीं मिली है।पायथन/matplotlib: एक 3 डी घन, एक गोलाकार और एक वेक्टर की साजिश?

  • एक wireframe घन 2
  • एक "wireframe" क्षेत्र 1
  • एक के दायरे 0 में केंद्रित का एक पक्ष की लंबाई के साथ 0 में केंद्रित:

    मैं निम्नलिखित बातें साजिश करना चाहते हैं निर्देशांक पर बिंदु [0, 0, 0]

  • एक सदिश कि इस बिंदु पर शुरू होता है और को जाता है [1, 1, 1]

कि कैसे करना है?

+3

यह भी देखें [mayavi2] (http://docs.enthought.com/mayavi/mayavi/auto/examples.html)। यह थोड़ा निर्भरता भारी है, लेकिन कुछ वाकई हाई स्तरीय कमांड हैं। वांछित अगर मैं उस पैकेज के आधार पर एक और विस्तृत उत्तर डाल सकता हूं। । । – meawoppl

उत्तर

134

यह थोड़ा जटिल है, लेकिन आप निम्नलिखित कोड द्वारा सभी ऑब्जेक्ट बना सकते हैं:

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
import numpy as np 
from itertools import product, combinations 


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

# draw cube 
r = [-1, 1] 
for s, e in combinations(np.array(list(product(r, r, r))), 2): 
    if np.sum(np.abs(s-e)) == r[1]-r[0]: 
     ax.plot3D(*zip(s, e), color="b") 

# draw sphere 
u, v = np.mgrid[0:2*np.pi:20j, 0:np.pi:10j] 
x = np.cos(u)*np.sin(v) 
y = np.sin(u)*np.sin(v) 
z = np.cos(v) 
ax.plot_wireframe(x, y, z, color="r") 

# draw a point 
ax.scatter([0], [0], [0], color="g", s=100) 

# draw a vector 
from matplotlib.patches import FancyArrowPatch 
from mpl_toolkits.mplot3d import proj3d 


class Arrow3D(FancyArrowPatch): 

    def __init__(self, xs, ys, zs, *args, **kwargs): 
     FancyArrowPatch.__init__(self, (0, 0), (0, 0), *args, **kwargs) 
     self._verts3d = xs, ys, zs 

    def draw(self, renderer): 
     xs3d, ys3d, zs3d = self._verts3d 
     xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M) 
     self.set_positions((xs[0], ys[0]), (xs[1], ys[1])) 
     FancyArrowPatch.draw(self, renderer) 

a = Arrow3D([0, 1], [0, 1], [0, 1], mutation_scale=20, 
      lw=1, arrowstyle="-|>", color="k") 
ax.add_artist(a) 
plt.show() 

output_figure

5

बस तीर ड्राइंग के लिए, वहाँ एक आसान तरीका है: -

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
fig = plt.figure() 
ax = fig.gca(projection='3d') 
ax.set_aspect("equal") 

#draw the arrow 
ax.quiver(0,0,0,1,1,1,length=1.0) 

plt.show() 

क्विवर वास्तव में एक ही समय में एकाधिक वैक्टरों को साजिश करने के लिए उपयोग किया जा सकता है। उपयोग इस प्रकार है: - [से http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html?highlight=quiver#mpl_toolkits.mplot3d.Axes3D.quiver]

तरकश (एक्स, वाई, जेड, यू, वी, डब्ल्यू, ** kwargs)

तर्क:

पहला, दूसरा, जेड : तीर स्थानों की एक्स, वाई और z निर्देशांक

यू, वी, डब्ल्यू: तीर वैक्टर की एक्स, वाई और जेड घटकों

तर्क सरणी या स्केलर हो सकते हैं।

कीवर्ड तर्क:

लंबाई: [1.0 | नाव] प्रत्येक तरकश की लंबाई, 1.0 करने के लिए डिफ़ॉल्ट, इकाई कुल्हाड़ियों

के साथ एक ही है

arrow_length_ratio: [0.3 | फ्लोट] क्विवर के संबंध में तीर सिर का अनुपात, 0.3

पिवट: ['पूंछ' | 'मध्य' | 'टिप'] ग्रिड बिंदु पर तीर का हिस्सा; तीर इस बिंदु के बारे में घूमता है, इसलिए नाम पिवट। डिफ़ॉल्ट 'पूंछ'

सामान्यीकृत: [झूठी | सच] सही होने पर, सभी तीर एक ही लंबाई होंगे। यह गलत है, जहां तीर यू, वी, डब्ल्यू के मूल्यों के आधार पर अलग-अलग लंबाई होंगे।