首页 文章

Matplotlib - 绘制一个平面并同时指向3D

提问于
浏览
8

我试图用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()

2 回答

  • 9

    只是添加到@suever 's answer, you there' s没有理由你不能创建 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')
    
  • 9

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

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

相关问题