एक 3 डी घन, एक गोले और एक वेक्टर को Matplotlib में प्लॉट करना


80

मैं खोजता हूं कि कैसे Matplotlib के साथ कम निर्देश के साथ कुछ प्लॉट किया जाए, लेकिन मुझे इसके लिए दस्तावेज़ में कोई मदद नहीं मिली।

मैं निम्नलिखित चीजों की साजिश करना चाहता हूं:

  • एक वायरफ्रेम क्यूब 0 में 2 की साइड लंबाई के साथ केंद्रित है
  • एक "वायरफ्रेम" क्षेत्र 0 में 1 के त्रिज्या के साथ केंद्रित है
  • निर्देशांक पर एक बिंदु [0, 0, 0]
  • एक वेक्टर जो इस बिंदु पर शुरू होता है और [1, 1, 1] तक जाता है

उसको कैसे करे?


3
इसके अलावा mayavi2 देखें । यह थोड़ा निर्भरता भारी है, लेकिन वास्तव में कुछ उच्च स्तरीय कमांड हैं। यदि वांछित है तो मैं उस पैकेज के आधार पर एक अधिक विस्तृत उत्तर दे सकता हूं। । ।
मेवप्लप

जवाबों:


180

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

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


12

सिर्फ तीर खींचने के लिए, एक आसान तरीका है: -

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.Axiver3D.quiver से]

तरकश (X, Y, Z, U, V, W, ** kwargs)

तर्क:

X, Y, Z: तीर स्थानों के x, y और z निर्देशांक

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

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

कीवर्ड तर्क:

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

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

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

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


0

मेरा उत्तर उपयोगकर्ता-परिभाषित अपारदर्शिता और कुछ एनोटेशन के आरेखण के विस्तार के साथ उपरोक्त दो का समामेलन है। यह चुंबकीय अनुनाद छवि (एमआरआई) के लिए एक क्षेत्र पर बी-वेक्टर दृश्य में आवेदन पाता है। उम्मीद है यह आपको उपयोगी होगा:

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

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

# draw sphere
u, v = np.mgrid[0:2*np.pi:50j, 0:np.pi:50j]
x = np.cos(u)*np.sin(v)
y = np.sin(u)*np.sin(v)
z = np.cos(v)
# alpha controls opacity
ax.plot_surface(x, y, z, color="g", alpha=0.3)


# a random array of 3D coordinates in [-1,1]
bvecs= np.random.randn(20,3)

# tails of the arrows
tails= np.zeros(len(bvecs))

# heads of the arrows with adjusted arrow head length
ax.quiver(tails,tails,tails,bvecs[:,0], bvecs[:,1], bvecs[:,2],
          length=1.0, normalize=True, color='r', arrow_length_ratio=0.15)

ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_zlabel('Z-axis')

ax.set_title('b-vectors on unit sphere')

plt.show()

कृपया समाप्त करें [0:2*np.pi:50j, 0:np.pi:50j]कि यह टुकड़ा कैसे काम करेगा। विश्लेषणात्मक दृष्टि से क्षेत्र का त्रिज्या और केंद्र क्या है?
राग्नर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.