Hướng dẫn how do you plot a plane in 3d python? - làm thế nào để bạn vẽ một chiếc máy bay trong 3d python?

38

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Tôi đang cố gắng vẽ đồng thời một mặt phẳng và một số điểm trong 3D với matplotlib. Tôi không có lỗi chỉ là điểm sẽ không xuất hiện. Tôi có thể vẽ đồ thị ở những thời điểm khác nhau và một số điểm nhưng không bao giờ cùng một lúc. Phần của mã trông giống như:

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

point  = np.array([1, 2, 3])
normal = np.array([1, 1, 2])

point2 = np.array([10, 50, 50])

# a plane is a*x+b*y+c*z+d=0
# [a,b,c] is the normal. Thus, we have to calculate
# d and we're set
d = -point.dot(normal)

# create x,y
xx, yy = np.meshgrid(range(10), range(10))

# calculate corresponding z
z = (-normal[0] * xx - normal[1] * yy - d) * 1. /normal[2]

# plot the surface
plt3d = plt.figure().gca(projection='3d')
plt3d.plot_surface(xx, yy, z, alpha=0.2)


#and i would like to plot this point : 
ax.scatter(point2[0] , point2[1] , point2[2],  color='green')

plt.show()

Đã hỏi ngày 17 tháng 3 năm 2016 lúc 12:44Mar 17, 2016 at 12:44

Hướng dẫn how do you plot a plane in 3d python? - làm thế nào để bạn vẽ một chiếc máy bay trong 3d python?

user3601754user3601754user3601754

3.66211 Huy hiệu vàng40 Huy hiệu bạc73 Huy hiệu đồng11 gold badges40 silver badges73 bronze badges

4

Chỉ cần thêm vào câu trả lời của @Suever, bạn không có lý do tại sao bạn không thể tạo

# Create the figure
fig = plt.figure()

# Add an axes
ax = fig.add_subplot(111,projection='3d')

# plot the surface
ax.plot_surface(xx, yy, z, alpha=0.2)

# and plot the point 
ax.scatter(point2[0] , point2[1] , point2[2],  color='green')
9 và sau đó vẽ cả bề mặt và các điểm phân tán trên đó. Sau đó, không cần phải sử dụng
# plot the surface
plt3d = plt.figure().gca(projection='3d')
plt3d.plot_surface(xx, yy, z, alpha=0.2)

# Ensure that the next plot doesn't overwrite the first plot
ax = plt.gca()
ax.hold(True)

ax.scatter(points2[0], point2[1], point2[2], color='green')
0:

# Create the figure
fig = plt.figure()

# Add an axes
ax = fig.add_subplot(111,projection='3d')

# plot the surface
ax.plot_surface(xx, yy, z, alpha=0.2)

# and plot the point 
ax.scatter(point2[0] , point2[1] , point2[2],  color='green')

Đã trả lời ngày 17 tháng 3 năm 2016 lúc 13:05Mar 17, 2016 at 13:05

tmdavisontmdavisontmdavison

60.2K12 Huy hiệu vàng169 Huy hiệu bạc153 Huy hiệu đồng12 gold badges169 silver badges153 bronze badges

Bạn sẽ cần phải nói với các trục rằng bạn muốn các lô mới thêm vào các lô hiện tại trên các trục thay vì ghi đè chúng. Để làm điều này, bạn sẽ cần sử dụng

# plot the surface
plt3d = plt.figure().gca(projection='3d')
plt3d.plot_surface(xx, yy, z, alpha=0.2)

# Ensure that the next plot doesn't overwrite the first plot
ax = plt.gca()
ax.hold(True)

ax.scatter(points2[0], point2[1], point2[2], color='green')
1

# plot the surface
plt3d = plt.figure().gca(projection='3d')
plt3d.plot_surface(xx, yy, z, alpha=0.2)

# Ensure that the next plot doesn't overwrite the first plot
ax = plt.gca()
ax.hold(True)

ax.scatter(points2[0], point2[1], point2[2], color='green')

Hướng dẫn how do you plot a plane in 3d python? - làm thế nào để bạn vẽ một chiếc máy bay trong 3d python?

CẬP NHẬT

Như @TCaswell đã chỉ ra trong các bình luận, họ đang xem xét việc ngừng hỗ trợ cho

# plot the surface
plt3d = plt.figure().gca(projection='3d')
plt3d.plot_surface(xx, yy, z, alpha=0.2)

# Ensure that the next plot doesn't overwrite the first plot
ax = plt.gca()
ax.hold(True)

ax.scatter(points2[0], point2[1], point2[2], color='green')
2. Do đó, một cách tiếp cận tốt hơn có thể là sử dụng các trục trực tiếp để thêm nhiều lô như trong câu trả lời của @Tom.

Đã trả lời ngày 17 tháng 3 năm 2016 lúc 13:00Mar 17, 2016 at 13:00

4

Chỉ cần xây dựng thêm một chút về phần toán (và cách thức hoạt động), có thể hữu ích cho ai đó, phương trình của mặt phẳng có vectơ bình thường đơn vị N chứa điểm A được hiển thị như sau:n containing a point a is shown as follows:

Hướng dẫn how do you plot a plane in 3d python? - làm thế nào để bạn vẽ một chiếc máy bay trong 3d python?

để phương trình của mặt phẳng ở đây là x + y + 2*z = 9 và mã sau có thể được sử dụng đơn giản để vẽ mặt phẳng đã cho:

# create the figure
fig = plt.figure()

# add axes
ax = fig.add_subplot(111,projection='3d')

xx, yy = np.meshgrid(range(10), range(10))
z = (9 - xx - yy) / 2 

# plot the plane
ax.plot_surface(xx, yy, z, alpha=0.5)

plt.show()

Hướng dẫn how do you plot a plane in 3d python? - làm thế nào để bạn vẽ một chiếc máy bay trong 3d python?

Âm mưu điểm rất đơn giản với

# plot the surface
plt3d = plt.figure().gca(projection='3d')
plt3d.plot_surface(xx, yy, z, alpha=0.2)

# Ensure that the next plot doesn't overwrite the first plot
ax = plt.gca()
ax.hold(True)

ax.scatter(points2[0], point2[1], point2[2], color='green')
3

Đã trả lời ngày 12 tháng 12 năm 2020 lúc 21:24Dec 12, 2020 at 21:24

Hướng dẫn how do you plot a plane in 3d python? - làm thế nào để bạn vẽ một chiếc máy bay trong 3d python?

Sandipan Deysandipan DeySandipan Dey

20.3k2 Huy hiệu vàng43 Huy hiệu bạc58 Huy hiệu Đồng2 gold badges43 silver badges58 bronze badges

Matplotlib ban đầu được thiết kế chỉ với âm mưu hai chiều trong tâm trí. Trong khoảng thời gian phát hành 1.0, một số tiện ích âm mưu ba chiều được xây dựng trên màn hình hai chiều của Matplotlib và kết quả là một bộ công cụ thuận tiện (nếu hơi hạn chế) để trực quan hóa dữ liệu ba chiều. Các sơ đồ ba chiều được bật bằng cách nhập bộ công cụ

# plot the surface
plt3d = plt.figure().gca(projection='3d')
plt3d.plot_surface(xx, yy, z, alpha=0.2)

# Ensure that the next plot doesn't overwrite the first plot
ax = plt.gca()
ax.hold(True)

ax.scatter(points2[0], point2[1], point2[2], color='green')
4, đi kèm với cài đặt matplotlib chính:

In [1]:

from mpl_toolkits import mplot3d

Khi mô hình con này được nhập, một trục ba chiều có thể được tạo bằng cách chuyển từ khóa

# plot the surface
plt3d = plt.figure().gca(projection='3d')
plt3d.plot_surface(xx, yy, z, alpha=0.2)

# Ensure that the next plot doesn't overwrite the first plot
ax = plt.gca()
ax.hold(True)

ax.scatter(points2[0], point2[1], point2[2], color='green')
5 cho bất kỳ thói quen tạo trục thông thường nào:

In [2]:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

In [3]:

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

Với các trục ba chiều này được kích hoạt, giờ đây chúng ta có thể vẽ một loạt các loại lô ba chiều. Cấu trúc ba chiều là một trong những chức năng có lợi rất cao từ việc xem các số liệu tương tác thay vì tĩnh trong sổ ghi chép; Hãy nhớ lại rằng để sử dụng các số liệu tương tác, bạn có thể sử dụng

# plot the surface
plt3d = plt.figure().gca(projection='3d')
plt3d.plot_surface(xx, yy, z, alpha=0.2)

# Ensure that the next plot doesn't overwrite the first plot
ax = plt.gca()
ax.hold(True)

ax.scatter(points2[0], point2[1], point2[2], color='green')
6 thay vì
# plot the surface
plt3d = plt.figure().gca(projection='3d')
plt3d.plot_surface(xx, yy, z, alpha=0.2)

# Ensure that the next plot doesn't overwrite the first plot
ax = plt.gca()
ax.hold(True)

ax.scatter(points2[0], point2[1], point2[2], color='green')
7 khi chạy mã này.

Điểm và dòng ba chiều

Biểu đồ ba chiều cơ bản nhất là một dòng hoặc bộ sưu tập các biểu đồ phân tán được tạo ra từ các bộ ba (x, y, z). Tương tự với các ô hai chiều phổ biến hơn được thảo luận trước đó, chúng có thể được tạo bằng các hàm

# plot the surface
plt3d = plt.figure().gca(projection='3d')
plt3d.plot_surface(xx, yy, z, alpha=0.2)

# Ensure that the next plot doesn't overwrite the first plot
ax = plt.gca()
ax.hold(True)

ax.scatter(points2[0], point2[1], point2[2], color='green')
8 và
# plot the surface
plt3d = plt.figure().gca(projection='3d')
plt3d.plot_surface(xx, yy, z, alpha=0.2)

# Ensure that the next plot doesn't overwrite the first plot
ax = plt.gca()
ax.hold(True)

ax.scatter(points2[0], point2[1], point2[2], color='green')
9. Chữ ký cuộc gọi cho những thứ này gần giống với các đối tác hai chiều của chúng, vì vậy bạn có thể tham khảo các sơ đồ dòng đơn giản và các sơ đồ phân tán đơn giản để biết thêm thông tin về việc kiểm soát đầu ra. Ở đây chúng ta sẽ vẽ một vòng xoáy lượng giác, cùng với một số điểm được vẽ ngẫu nhiên gần dòng:

In [4]:

ax = plt.axes(projection='3d')

# Data for a three-dimensional line
zline = np.linspace(0, 15, 1000)
xline = np.sin(zline)
yline = np.cos(zline)
ax.plot3D(xline, yline, zline, 'gray')

# Data for three-dimensional scattered points
zdata = 15 * np.random.random(100)
xdata = np.sin(zdata) + 0.1 * np.random.randn(100)
ydata = np.cos(zdata) + 0.1 * np.random.randn(100)
ax.scatter3D(xdata, ydata, zdata, c=zdata, cmap='Greens');

Lưu ý rằng theo mặc định, các điểm phân tán có tính minh bạch của chúng được điều chỉnh để mang lại cảm giác về độ sâu trên trang. Mặc dù hiệu ứng ba chiều đôi khi rất khó nhìn thấy trong một hình ảnh tĩnh, một chế độ xem tương tác có thể dẫn đến một số trực giác đẹp về bố cục của các điểm.

Lô đường viền ba chiều

Tương tự như các ô đường viền mà chúng tôi đã khám phá về mật độ và sơ đồ đường viền,

# plot the surface
plt3d = plt.figure().gca(projection='3d')
plt3d.plot_surface(xx, yy, z, alpha=0.2)

# Ensure that the next plot doesn't overwrite the first plot
ax = plt.gca()
ax.hold(True)

ax.scatter(points2[0], point2[1], point2[2], color='green')
4 chứa các công cụ để tạo ra các ô cứu trợ ba chiều bằng cách sử dụng các đầu vào tương tự. Giống như các sơ đồ
# create the figure
fig = plt.figure()

# add axes
ax = fig.add_subplot(111,projection='3d')

xx, yy = np.meshgrid(range(10), range(10))
z = (9 - xx - yy) / 2 

# plot the plane
ax.plot_surface(xx, yy, z, alpha=0.5)

plt.show()
1 hai chiều,
# create the figure
fig = plt.figure()

# add axes
ax = fig.add_subplot(111,projection='3d')

xx, yy = np.meshgrid(range(10), range(10))
z = (9 - xx - yy) / 2 

# plot the plane
ax.plot_surface(xx, yy, z, alpha=0.5)

plt.show()
2 yêu cầu tất cả các dữ liệu đầu vào phải ở dạng các lưới chính quy hai chiều, với dữ liệu Z được đánh giá tại mỗi điểm. Ở đây chúng tôi sẽ hiển thị sơ đồ đường viền ba chiều của chức năng hình sin ba chiều:

In [5]:

def f(x, y):
    return np.sin(np.sqrt(x ** 2 + y ** 2))

x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)

X, Y = np.meshgrid(x, y)
Z = f(X, Y)

In [6]:

fig = plt.figure()
ax = plt.axes(projection='3d')
ax.contour3D(X, Y, Z, 50, cmap='binary')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z');

Đôi khi góc xem mặc định không tối ưu, trong trường hợp đó chúng ta có thể sử dụng phương pháp

# create the figure
fig = plt.figure()

# add axes
ax = fig.add_subplot(111,projection='3d')

xx, yy = np.meshgrid(range(10), range(10))
z = (9 - xx - yy) / 2 

# plot the plane
ax.plot_surface(xx, yy, z, alpha=0.5)

plt.show()
3 để đặt góc độ cao và góc phương vị. Trong ví dụ sau, chúng ta sẽ sử dụng độ cao 60 độ (nghĩa là 60 độ so với mặt phẳng X-Y) và góc phương vị 35 độ (nghĩa là xoay 35 độ ngược chiều kim đồng hồ về trục z):

Một lần nữa, lưu ý rằng loại xoay này có thể được thực hiện tương tác bằng cách nhấp và kéo khi sử dụng một trong các phụ trợ tương tác của Matplotlib.

Khung dây và lô bề mặt

Hai loại sơ đồ ba chiều khác hoạt động trên dữ liệu có lưới là khung dây và các ô bề mặt. Chúng lấy một lưới các giá trị và chiếu nó lên bề mặt ba chiều được chỉ định và có thể làm cho các dạng ba chiều kết quả khá dễ dàng để hình dung. Đây là một ví dụ về việc sử dụng khung dây:

In [8]:

# Create the figure
fig = plt.figure()

# Add an axes
ax = fig.add_subplot(111,projection='3d')

# plot the surface
ax.plot_surface(xx, yy, z, alpha=0.2)

# and plot the point 
ax.scatter(point2[0] , point2[1] , point2[2],  color='green')
0

Một âm mưu bề mặt giống như một âm mưu khung dây, nhưng mỗi mặt của khung dây là một đa giác đầy. Thêm một colormap vào các đa giác đầy có thể hỗ trợ nhận thức về cấu trúc liên kết của bề mặt được hình dung:

In [9]:

# Create the figure
fig = plt.figure()

# Add an axes
ax = fig.add_subplot(111,projection='3d')

# plot the surface
ax.plot_surface(xx, yy, z, alpha=0.2)

# and plot the point 
ax.scatter(point2[0] , point2[1] , point2[2],  color='green')
1

Lưu ý rằng mặc dù lưới các giá trị cho một biểu đồ bề mặt cần phải là hai chiều, nhưng nó không cần phải là trực tràng. Dưới đây là một ví dụ về việc tạo ra một lưới cực một phần, khi được sử dụng với biểu đồ

# create the figure
fig = plt.figure()

# add axes
ax = fig.add_subplot(111,projection='3d')

xx, yy = np.meshgrid(range(10), range(10))
z = (9 - xx - yy) / 2 

# plot the plane
ax.plot_surface(xx, yy, z, alpha=0.5)

plt.show()
4 có thể cho chúng ta một lát cắt vào chức năng mà chúng ta đang hình dung:

In [10]:

# Create the figure
fig = plt.figure()

# Add an axes
ax = fig.add_subplot(111,projection='3d')

# plot the surface
ax.plot_surface(xx, yy, z, alpha=0.2)

# and plot the point 
ax.scatter(point2[0] , point2[1] , point2[2],  color='green')
2

Tam giác bề mặt

Đối với một số ứng dụng, các lưới được lấy mẫu đồng đều theo yêu cầu của các thói quen trên là quá hạn chế và bất tiện. Trong những tình huống này, các lô dựa trên tam giác có thể rất hữu ích. Điều gì sẽ xảy ra nếu thay vì một trận hòa thậm chí từ một cartesian hoặc lưới cực, thay vào đó chúng ta có một tập hợp các trận hòa ngẫu nhiên?

In [11]:

# Create the figure
fig = plt.figure()

# Add an axes
ax = fig.add_subplot(111,projection='3d')

# plot the surface
ax.plot_surface(xx, yy, z, alpha=0.2)

# and plot the point 
ax.scatter(point2[0] , point2[1] , point2[2],  color='green')
3

Chúng ta có thể tạo ra một biểu đồ phân tán của các điểm để có được ý tưởng về bề mặt mà chúng ta đang lấy mẫu từ:

In [12]:

# Create the figure
fig = plt.figure()

# Add an axes
ax = fig.add_subplot(111,projection='3d')

# plot the surface
ax.plot_surface(xx, yy, z, alpha=0.2)

# and plot the point 
ax.scatter(point2[0] , point2[1] , point2[2],  color='green')
4

Điều này để lại rất nhiều điều mong muốn. Chức năng sẽ giúp chúng ta trong trường hợp này là

# create the figure
fig = plt.figure()

# add axes
ax = fig.add_subplot(111,projection='3d')

xx, yy = np.meshgrid(range(10), range(10))
z = (9 - xx - yy) / 2 

# plot the plane
ax.plot_surface(xx, yy, z, alpha=0.5)

plt.show()
5, tạo ra một bề mặt bằng cách tìm thấy một bộ hình tam giác được hình thành giữa các điểm liền kề (hãy nhớ rằng X, Y và Z Đây là các mảng một chiều):

In [13]:

# Create the figure
fig = plt.figure()

# Add an axes
ax = fig.add_subplot(111,projection='3d')

# plot the surface
ax.plot_surface(xx, yy, z, alpha=0.2)

# and plot the point 
ax.scatter(point2[0] , point2[1] , point2[2],  color='green')
5

Kết quả chắc chắn không sạch sẽ như khi nó được vẽ với một lưới, nhưng tính linh hoạt của một tam giác như vậy cho phép một số lô ba chiều thực sự thú vị. Ví dụ, thực sự có thể vẽ một dải Möbius ba chiều bằng cách sử dụng điều này, như chúng ta sẽ thấy tiếp theo.

Ví dụ: Hình dung một dải Möbius

Một dải Möbius tương tự như một dải giấy dán vào một vòng lặp với một nửa twist. Về mặt cấu trúc, nó khá thú vị bởi vì mặc dù xuất hiện nó chỉ có một mặt duy nhất! Ở đây chúng tôi sẽ trực quan hóa một đối tượng như vậy bằng cách sử dụng các công cụ ba chiều của Matplotlib. Chìa khóa để tạo dải Möbius là suy nghĩ về tham số hóa của nó: đó là một dải hai chiều, vì vậy chúng ta cần hai kích thước nội tại. Hãy gọi chúng là $ \ theta $, dao động từ $ 0 $ đến $ 2 \ pi $ xung quanh vòng lặp và $ w $ dao động từ -1 đến 1 trên chiều rộng của dải:

In [14]:

# Create the figure
fig = plt.figure()

# Add an axes
ax = fig.add_subplot(111,projection='3d')

# plot the surface
ax.plot_surface(xx, yy, z, alpha=0.2)

# and plot the point 
ax.scatter(point2[0] , point2[1] , point2[2],  color='green')
6

Bây giờ từ tham số này, chúng ta phải xác định vị trí (x, y, z) của dải nhúng.

Suy nghĩ về nó, chúng ta có thể nhận ra rằng có hai vòng quay xảy ra: một là vị trí của vòng lặp về trung tâm của nó (cái mà chúng ta gọi là $ \ theta $), trong khi cái còn lại là sự xoắn của dải về trục của nó (chúng ta 'll gọi đây là $ \ Phi $). Đối với một dải Möbius, chúng ta phải có dải tạo ra một nửa trong vòng lặp đầy đủ hoặc $ \ Delta \ Phi = \ Delta \ theta/2 $.

Bây giờ chúng tôi sử dụng hồi ức về lượng giác để rút ra sự nhúng ba chiều. Chúng tôi sẽ xác định $ R $, khoảng cách của mỗi điểm từ trung tâm và sử dụng điều này để tìm tọa độ $ (x, y, z) $: tọa độ:

Trong & nbsp; [16]:

# Create the figure
fig = plt.figure()

# Add an axes
ax = fig.add_subplot(111,projection='3d')

# plot the surface
ax.plot_surface(xx, yy, z, alpha=0.2)

# and plot the point 
ax.scatter(point2[0] , point2[1] , point2[2],  color='green')
7

Cuối cùng, để vẽ biểu đồ đối tượng, chúng ta phải đảm bảo rằng tam giác là chính xác. Cách tốt nhất để làm điều này là xác định phép tam giác trong các tham số cơ bản, và sau đó để cho matplotlib dự án tam giác này vào không gian ba chiều của dải Möbius. Điều này có thể được thực hiện như sau:

In [17]:

# Create the figure
fig = plt.figure()

# Add an axes
ax = fig.add_subplot(111,projection='3d')

# plot the surface
ax.plot_surface(xx, yy, z, alpha=0.2)

# and plot the point 
ax.scatter(point2[0] , point2[1] , point2[2],  color='green')
8

Kết hợp tất cả các kỹ thuật này, có thể tạo và hiển thị một loạt các đối tượng và mẫu ba chiều trong matplotlib.

Làm thế nào để bạn vẽ một mặt phẳng 3D?

Có 4 bước chính:..
Thiết lập miền bằng cách tạo các vectơ cho x và y (sử dụng không gian linspace, v.v.).
Tạo một "lưới" trong mặt phẳng XY cho miền bằng cách sử dụng lệnh meshgrid ..
Tính Z cho bề mặt, sử dụng các tính toán theo thành phần ..
Vẽ biểu đồ bề mặt. Các lệnh chính là lưới (x, y, z) và lướt (z, y, z).

Làm thế nào để bạn vẽ một bề mặt 3D trong Python?

Chúng ta cũng có thể vẽ các bề mặt 3D trong Python, hàm để vẽ các bề mặt 3D là Plot_surface (X, Y, Z), trong đó X và Y là các mảng đầu ra từ Meshgrid và Z = F (X, Y) hoặc Z (I, j) = f (x (i, j), y (i, j)).Các hàm vẽ bề mặt phổ biến nhất là lướt và đường viền.THỬ NÓ!plot_surface(X,Y,Z), where X and Y are the output arrays from meshgrid, and Z=f(X,Y) or Z(i,j)=f(X(i,j),Y(i,j)). The most common surface plotting functions are surf and contour. TRY IT!

Làm thế nào để bạn vẽ đường viền 3D trong Python?

Hàm ax.contour3d () tạo ra biểu đồ đường viền ba chiều.Nó đòi hỏi tất cả các dữ liệu đầu vào phải ở dạng lưới chính quy hai chiều, với dữ liệu Z được đánh giá tại mỗi điểm. contour3D() function creates three-dimensional contour plot. It requires all the input data to be in the form of two-dimensional regular grids, with the Z-data evaluated at each point.

Biểu đồ 3D có thể trong matplotlib không?

Matplotlib được giới thiệu trong tâm trí, chỉ có âm mưu hai chiều.Nhưng tại thời điểm phát hành 1.0 xảy ra, các tiện ích 3D đã được phát triển trên 2D và do đó, chúng tôi đã triển khai dữ liệu 3D có sẵn ngày hôm nay!Các sơ đồ 3D được bật bằng cách nhập bộ công cụ MPLOT3D.The 3d plots are enabled by importing the mplot3d toolkit.