python - matrices - Matplotlib: grafica un plano y puntos en 3D simultáneamente
python graficos 2d (2)
Intento trazar simultáneamente un plano y algunos puntos en 3D con Matplotlib. No tengo errores, solo el punto no aparecerá. Puedo trazar en diferentes momentos algunos puntos y planos, pero nunca al mismo tiempo. La parte del código se ve así:
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()
Solo para agregar a la respuesta de @ suever, no hay ninguna razón por la cual no puedas crear los Axes
y luego graficar tanto la superficie como los puntos de dispersión en ella. Entonces no hay necesidad de usar 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'')
Tendrá que indicar a los ejes que desea agregar nuevos trazados a los trazados actuales en los ejes en lugar de sobreescribirlos. Para hacer esto, necesitarás usar 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'')
ACTUALIZAR
Como @tcaswell señaló en los comentarios, están considerando suspender el soporte para hold
. Como resultado, un mejor enfoque puede ser usar los ejes directamente para agregar más trazados como en la respuesta de @ tom.