2012-06-21 48 views
51

Tôi tìm cách làm thế nào để vẽ một cái gì đó với ít hướng dẫn càng tốt với matplotlib nhưng tôi không tìm thấy bất kỳ trợ giúp cho điều này trong tài liệu.Python/matplotlib: vẽ đồ thị khối lập phương 3d, hình cầu và vec-tơ?

Tôi muốn âm mưu những điều sau đây:

  • một khối lập phương wireframe làm trung tâm trong 0 với chiều dài bên của 2
  • một "wireframe" sphere làm trung tâm trong 0 với bán kính 1
  • một điểm tại tọa độ [0, 0, 0]
  • một vector mà bắt đầu vào thời điểm này và đi vào [1, 1, 1]

làm thế nào để làm điều đó?

+3

Ngoài ra, hãy xem [mayavi2] (http://docs.enthought.com/mayavi/mayavi/auto/examples.html). Đó là một chút phụ thuộc nặng nề, nhưng có một số lệnh cấp cao thực sự tuyệt vời. Tôi có thể đặt cùng một câu trả lời chi tiết hơn dựa trên gói đó nếu muốn. . . – meawoppl

Trả lời

134

Nó là một chút phức tạp, nhưng bạn có thể vẽ tất cả các đối tượng bằng đoạn mã sau:

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

Đối với bản vẽ chỉ vào mũi tên, có một phương pháp dễ dàng hơn: -

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() 

rung động thực sự có thể được sử dụng để vẽ nhiều vectơ cùng một lúc. Việc sử dụng như sau: - [từ http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html?highlight=quiver#mpl_toolkits.mplot3d.Axes3D.quiver]

rung (X, Y, Z, U, V, W, ** kwargs)

Arguments:

X, Y, Z : x, y, z tọa độ của địa điểm mũi tên

U, V, W: thành phần x, y và z của các vectơ mũi tên

Đối số có thể là mảng hoặc vô hướng.

luận Từ khóa:

dài: [1.0 | float] Độ dài của mỗi rung động, mặc định là 1.0, đơn vị là giống nhau với các trục

arrow_length_ratio: [0.3 | float] Tỷ lệ của đầu mũi tên đối với rung động, mặc định là 0.3

trục: [‘tail’ | ‘Trung’ | 'Tip'] Phần mũi tên nằm ở điểm lưới; mũi tên quay về điểm này, do đó tên trục xoay. Mặc định là ‘đuôi’

bình thường hóa: [Sai | True] Khi True, tất cả các mũi tên sẽ có cùng độ dài. Giá trị mặc định là False, trong đó các mũi tên sẽ có độ dài khác nhau tùy thuộc vào giá trị của u, v, w.