簡體   English   中英

如何繪制帶有網格的圓柱體?

[英]How to plot a cylinder with grid on it?

我想繪制一個以(0,0,0)為中心的圓柱體,給出其高度(h = 40)和半徑(r = 20)。 我還想在其表面上創建一個網格。

我的問題如下:當我嘗試繪制圓柱體的頂部和底部時,它們在我的圖形上顯示為正方形而不是磁盤。 另外,當我使用Axes3D(matplotlib)中的線框功能為外側部分設置網格時,由於某種原因,網格會出現在頂部,並且正方形的大小並不恆定。

fig1 = plt.figure(figsize = (10,10)) #On nomme la figure
env = fig1.add_subplot(111, projection='3d') #On crée le volume 3D avec quadrillage et axes


# Parois latérales

no_values = 1000
phi_cyl = np.linspace(0, 2*np.pi, no_values)
x_walls = R * np.cos(phi_cyl) #Valeurs de X prises par le cylindre externe
z_walls = np.linspace(-h/2, h/2, no_values)
x2D_walls, z2D_walls = np.meshgrid(x_walls, z_walls)
y2D_walls = np.sqrt(R**2 - x2D_walls**2)
env.plot_surface(x2D_walls, y2D_walls, z2D_walls, color='k', alpha=0.03)
env.plot_surface(x2D_walls, -y2D_walls, z2D_walls, color='k', alpha=0.03,)
env.plot_wireframe(x2D_walls, y2D_walls, z2D_walls, rstride=2, cstride =2)
env.plot_wireframe(x2D_walls, -y2D_walls, z2D_walls, rstride=2, cstride =2)


#Plafond

phi_cyl = np.linspace(0, 2*np.pi, no_values)
x_ceiling = R * np.cos(phi_cyl)
y_ceiling = R * np.sin(phi_cyl)
x2D_ceiling, y2D_ceiling = np.meshgrid(x_ceiling, y_ceiling)
z2D_ceiling = np.ones((len(x_ceiling),len(y_ceiling)))* h/2
env.plot_surface(x2D_ceiling, y2D_ceiling, z2D_ceiling, color='k', alpha=0.03)
env.plot_wireframe(x2D_ceiling, y2D_ceiling, z2D_ceiling, rstride=2, cstride =2)


#Sol

phi_cyl = np.linspace(0, 2*np.pi, no_values)
x_floor = R * np.cos(phi_cyl)
y_floor = R * np.sin(phi_cyl)
x2D_floor, y2D_floor = np.meshgrid(x_floor, y_floor)
z2D_floor = - np.ones((len(x_floor),len(y_floor)))* h/2
env.plot_surface(x2D_floor, y2D_floor, z2D_floor, color='k', alpha=0.03)
env.plot_surface(x2D_floor, y2D_floor, z2D_floor, color='k', alpha=0.03, rstride=2, cstride=2)



plt.title('Détecteur T2K')
env.set_xlabel('Profondeur [m]')
env.set_ylabel('Largeur [m]')
env.set_zlabel('Hauteur [m]')
plt.show()
plt.savefig("Cuve")

我想要一個尺寸為0.5 * 0.5的正方形的網格,最后關閉圓柱體。 謝謝您的幫助

因此,網格是導致圓柱體頂部和底部具有矩形網格的原因,因為x_ceiling和y_ceiling都將定義為-20,且正數為20。您可以使用np.outer在頂部繪制圓和底部邊界,但這會使圓處於一種極坐標類型,不會給您0.5 x.5的框。 我無法找到其他解決方法,因此也許其他人會有更好的答案,但這可能是一個臨時解決方案。

from mpl_toolkits.mplot3d import Axes3D
fig1 = plt.figure(figsize = (10,10)) #On nomme la figure
env = fig1.add_subplot(111, projection='3d') #On crée le volume 3D avec quadrillage et axes

R=20.
h=40.
# Parois latérales

no_values = 100.
phi_cyl = np.linspace(0, 2*np.pi, no_values)
x_walls = R * np.cos(phi_cyl) #Valeurs de X prises par le cylindre externe
z_walls = np.linspace(-h/2, h/2, no_values)
x2D_walls, z2D_walls = np.meshgrid(x_walls, z_walls)
y2D_walls = np.sqrt(R**2 - x2D_walls**2)


env.plot_surface(x2D_walls, y2D_walls, z2D_walls, color='k', alpha=0.03)
env.plot_surface(x2D_walls, -y2D_walls, z2D_walls, color='k', alpha=0.03,)
env.plot_wireframe(x2D_walls, y2D_walls, z2D_walls, rstride=2, cstride =2)
env.plot_wireframe(x2D_walls, -y2D_walls, z2D_walls, rstride=2, cstride =2)


#Plafond

phi_cyl = np.linspace(0, 2*np.pi, no_values)

#Set the radii intervals for the circle
Rs = np.arange(0,R+1,1)

x_ceiling = np.outer(Rs, np.cos(phi_cyl))
y_ceiling = np.outer(Rs, np.sin(phi_cyl))

z2D_ceiling = np.ones((y_ceiling.shape))* h/2.
env.plot_surface(x_ceiling, y_ceiling, z2D_ceiling, color='k', alpha=0.03)
env.plot_wireframe(x_ceiling, y_ceiling, z2D_ceiling, rstride=2, cstride =2)


#Sol

phi_cyl = np.linspace(0, 2*np.pi, no_values)
Rs = np.arange(0,R+1,1)
x_floor = np.outer(Rs, np.cos(phi_cyl))
y_floor = np.outer(Rs, np.sin(phi_cyl))

z2D_floor = np.ones((y_floor.shape))* -h/2.
env.plot_surface(x_floor, y_floor, z2D_floor, color='k', alpha=0.03)
env.plot_wireframe(x_floor, y_floor, z2D_floor, rstride=2, cstride =2)



plt.show()

這將產生下圖:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM