2016-03-17 102 views
5

Tôi cố gắng vẽ âm mưu đồng thời một mặt phẳng và một số điểm trong 3D bằng Matplotlib. Tôi không có lỗi chỉ là điểm sẽ không xuất hiện. Tôi có thể vẽ tại các thời điểm khác nhau một số điểm và máy bay nhưng không bao giờ cùng một lúc. Các phần của mã trông giống như:Matplotlib - Vẽ một mặt phẳng và các điểm trong 3D đồng thời

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

liên quan: https://stackoverflow.com/questions/13464304/how-can-i-plot-a-3d-plane-in-matlab/13473027#13473027 –

+0

@AndreyRubshtein làm thế nào là có liên quan? Câu hỏi liên kết của bạn là về 'matlab', đây là về' matplotlib' – tom

+0

Hey @tom, nó có một giải thích về công thức toán học, cái được gọi là 'Tính toán z tương ứng' trong câu hỏi gốc –

Trả lời

6

Bạn sẽ cần phải nói với các trục mà bạn muốn âm mưu mới để thêm đến lô hiện trên các trục chứ không phải là ghi đè lên chúng. Để làm điều này, bạn sẽ cần phải sử dụng axes.hold(True)

# 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') 

enter image description here

CẬP NHẬT

Như @tcaswell chỉ ra trong các ý kiến, họ đang xem xét ngừng hỗ trợ cho hold. Do đó, cách tiếp cận tốt hơn có thể là sử dụng trực tiếp các trục để thêm các ô khác như trong @tom's answer.

+0

cảm ơn rất nhiều nó hoạt động;) – user3601754

+0

Bạn có thực sự sử dụng 'hold' hàng ngày không? Chúng tôi đã nói về việc không dùng nó và tôi muốn nói chuyện với một người thực sự sử dụng nó .... – tacaswell

+0

@tcaswell Tôi có khuynh hướng, nhưng tôi nghĩ nó chủ yếu là do những thói quen mà tôi đã phát triển từ việc sử dụng MATLAB. Điều đó đang được nói, tôi thực sự làm như cách tiếp cận thay thế được đề cập bởi [tom] (http://stackoverflow.com/a/36061408/670206) nhưng tôi không bao giờ nghĩ rằng để sử dụng nó! – Suever

5

Chỉ cần thêm vào câu trả lời của @ suever, bạn không có lý do gì khiến bạn không thể tạo Axes và sau đó vẽ cả hai bề mặt và các điểm tán xạ trên đó. Sau đó, không có nhu cầu sử dụng ax.hold():

# 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') 
Các vấn đề liên quan