matplotlib 同时在3D中打印平面和点

rsaldnfx  于 2023-05-01  发布在  其他
关注(0)|答案(3)|浏览(145)

我试图用Matplotlib同时绘制一个平面和一些3D点。我没有错误只是点不会出现。我可以在不同的时间绘制一些点和平面,但永远不会在同一时间。代码的部分看起来像:

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()
uttx8gqw

uttx8gqw1#

只是为了补充@suever的答案,你没有理由不能创建Axes,然后在上面绘制表面和散射点。那么就不需要使用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')
6ss1mwsb

6ss1mwsb2#

您需要告诉轴,您希望将新的绘图 * 添加 * 到轴上的当前绘图中,而不是覆盖它们。为此,您需要使用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')

更新

正如@tcaswell在评论中指出的那样,他们正在考虑停止对hold的支持。因此,更好的方法可能是直接使用轴来添加更多的图,如@tom的答案。

6ovsh4lw

6ovsh4lw3#

只是详细说明数学部分(以及它是如何工作的),可能对某人有用,单位法向量n包含点a的平面方程如下所示:

使得这里的平面方程是x + y + 2*z = 9,并且可以简单地使用下面的代码来绘制给定的平面:

# create the figure
fig = plt.figure()

# add axes
ax = fig.add_subplot(111,projection='3d')

xx, yy = np.meshgrid(range(10), range(10))
z = (9 - xx - yy) / 2 

# plot the plane
ax.plot_surface(xx, yy, z, alpha=0.5)

plt.show()

使用scatter()可以直接绘制该点

相关问题