2016-03-17 1 views
5

J'essaie de tracer simultanément un plan et quelques points en 3D avec Matplotlib. Je n'ai pas d'erreur juste le point n'apparaîtra pas. Je peux tracer à différents moments des points et des plans mais jamais en même temps. La partie du code ressemble à:Matplotlib - Tracer un plan et des points en 3D simultanément

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

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

+0

@AndreyRubshtein comment est-ce lié? La question à laquelle votre lien est à propos de 'matlab', il s'agit de' matplotlib' – tom

+0

Hey @tom, il a une explication sur la formule mathématique, celle qui est appelée 'Calculer correspondant z' dans la question initiale –

Répondre

6

Vous aurez besoin de dire les axes que vous voulez de nouvelles parcelles à ajouter aux parcelles actuelles sur les axes plutôt que de les écraser. Pour ce faire, vous devrez utiliser 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

MISE À JOUR

Comme @tcaswell a souligné dans les commentaires, ils envisagent de cesser soutien hold. En conséquence, une meilleure approche peut être d'utiliser directement les axes pour ajouter plus de parcelles comme dans @tom's answer.

+0

merci beaucoup cela fonctionne;) – user3601754

+0

Utilisez-vous réellement «tenir» au jour le jour? Nous avons parlé de le déprécier et j'aimerais parler à quelqu'un qui l'utilise réellement ... – tacaswell

+0

@tcaswell J'ai tendance à le faire, mais je pense que c'est principalement dû aux habitudes que j'ai développées en utilisant MATLAB. Cela étant dit, j'aime vraiment l'approche alternative mentionnée par [tom] (http://stackoverflow.com/a/36061408/670206) mais je ne pense jamais à l'utiliser! – Suever

5

Juste pour ajouter à la réponse de @ suever, vous n'avez aucune raison pour laquelle vous ne pouvez pas créer le Axes, puis tracer le surface et les points de dispersion sur elle. Ensuite, il n'y a pas besoin d'utiliser 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')