2016-03-17 19 views
5

Próbuję wydrukować jednocześnie płaszczyznę i kilka punktów w 3D za pomocą Matplotlib. Nie mam żadnych błędów, tylko punkt nie pojawi się. Potrafię rysować w różnych momentach niektóre punkty i samoloty, ale nigdy w tym samym czasie. Część kodu wygląda następująco:Matplotlib - Narysuj płaszczyznę i punkty w 3D jednocześnie

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

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

+0

@AndreyRubshtein jak to jest powiązane? Pytanie do twojego linku dotyczy 'matlab', to jest o' matplotlib' – tom

+0

Hej @tom, zawiera wyjaśnienie dotyczące formuły matematycznej, która nazywa się "Oblicz odpowiednie z" w oryginalnym pytaniu –

Odpowiedz

6

Trzeba powiedzieć osie, które mają nowe działki do dodać do obecnych działek na osi zamiast ich nadpisanie. Aby to zrobić, trzeba będzie użyć 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

UPDATE

Jak @tcaswell zauważył w komentarzach, że rozważa zaprzestanie wsparcia dla hold. W rezultacie, lepszym rozwiązaniem może być użycie osie bezpośrednio dodać więcej działek jak w @tom's answer.

+0

bardzo dziękuję;) – user3601754

+0

Czy używasz 'hold' z dnia na dzień? Rozmawialiśmy o tym, aby go porzucić i chciałbym porozmawiać z kimś, kto faktycznie go używa ... – tacaswell

+0

@tcaswell Mam na myśli, ale myślę, że to głównie ze względu na nawyki, które opracowałem przy użyciu MATLAB. Biorąc to pod uwagę, faktycznie podoba mi się alternatywne podejście wymienione przez [tom] (http://stackoverflow.com/a/36061408/670206), ale nigdy nie sądzę, aby go użyć! – Suever

5

Wystarczy dodać do użytkownika @ suever odpowiedź, to nie ma powodu, dlaczego nie można utworzyć Axes a następnie wykreślić zarówno powierzchnia i punkty rozproszenia na nim. Wtedy nie ma potrzeby korzystania 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')