3次元の点群に平面を当てはめ、最初はnp.meshgridを使って任意のサイズにしましたが、今はその平面を中心とした円柱をプロットしようとしています同じように方向付けられています(つまり、平面フィットは円筒の高さを半分にカットします)が、半径と高さが指定されています。私が見つけることができるmatplotlibにプロットされたシリンダの唯一の例は中空で、通常は上下に開きます。私はソリッドにプロットしたいので、それが囲んでいるポイントを明確に見ることができます。Matplotlibの平面を中心とした円柱をプロットする
ランダムに生成されたプレーンを使用した最小の実例です。私が使用している平面は常に点と法線ベクトルで与えられるので、円柱はこれらのものに基づいていなければなりません(加えて、与えられた半径と平面の上下に伸びる高さ)。
from __future__ import division #Enables new-style division
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import seaborn as sns
import numpy as np
cen_x = 0
cen_y = 0
cen_z = 0
origin = np.array([cen_x,cen_y,cen_z])
normal = np.array([np.random.uniform(-1,1),np.random.uniform(-1,1),np.random.uniform(0,1)])
a = normal[0]
b = normal[1]
c = normal[2]
#equation for a plane is a*x+b*y+c*z+d=0 where [a,b,c] is the normal
#so calculate d from the normal
d = -origin.dot(normal)
# create x,y meshgrid
xx, yy = np.meshgrid(np.arange(cen_x-1,cen_x+1,0.01),np.arange(cen_y-1,cen_y+1,0.01))
# calculate corresponding z
zz = (-a * xx - b * yy - d) * 1./c
halo_x = [-0.3, -0.9, 0.8, 1.3, -0.1, 0.5]
halo_y = [0.8, 1.1, -0.5, -0.7, -1.2, 0.1]
halo_z = [1.0, -0.4, 0.3, -1.2, 0.9, 1.2]
fig = plt.figure(figsize=(9,9))
plt3d = fig.gca(projection='3d')
plt3d.plot_surface(xx, yy, zz, color='r', alpha=0.4)
plt3d.set_xlim3d(cen_x-3,cen_x+3)
plt3d.set_ylim3d(cen_y-3,cen_y+3)
plt3d.set_zlim3d(cen_z-3,cen_z+3)
plt3d.set_xlabel('X')
plt3d.set_ylabel('Y')
plt3d.set_zlabel('Z')
plt.show()