web-dev-qa-db-fra.com

Matplotlib - Tracez un plan et des points en 3D simultanément

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

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

Vous devrez indiquer aux axes que vous souhaitez que les nouveaux tracés - ajouter aux tracés actuels 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 l'a souligné dans les commentaires, ils envisagent de supprimer le support de hold. En conséquence, une meilleure approche peut être d'utiliser les axes directement pour ajouter plus de tracés comme dans réponse de @ tom.

12
Suever

Pour ajouter à la réponse de @ suever, il n'y a aucune raison pour laquelle vous ne pouvez pas créer le Axes, puis tracer à la fois la surface et les points de dispersion sur celle-ci. Ensuite, il n'est pas nécessaire 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')
11
tmdavison