正如问题所说,我试图使用 python 绘制晶体场轨道。我知道球谐函数计算可能有点复杂,所以这就是我尝试的方法:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(10, 8))
ax1 = fig.add_subplot(231, projection='3d')
ax2 = fig.add_subplot(232, projection='3d')
ax3 = fig.add_subplot(233, projection='3d')
ax4 = fig.add_subplot(234, projection='3d')
ax5 = fig.add_subplot(235, projection='3d')
theta = np.linspace(0, 2*np.pi, 100)
phi = np.linspace(0, np.pi, 100)
theta, phi = np.meshgrid(theta, phi)
# Define the radial functions for each orbital
dx2_minus_y2 = np.sqrt(3/np.pi) * np.cos(phi)**2
dz2 = np.sqrt(5/16*np.pi) * (3*np.cos(phi)**2 - 1)
dyz = np.sqrt(15/np.pi) * np.sin(phi) * np.cos(phi) * np.exp(1j*theta)
dxz = np.sqrt(15/np.pi) * np.sin(phi) * np.cos(phi) * np.exp(1j*theta)
dxy = np.sqrt(15/np.pi) * np.sin(phi)**2 * np.exp(2j*theta)
# Convert spherical coordinates to Cartesian coordinates
x = np.sin(phi) * np.cos(theta)
y = np.sin(phi) * np.sin(theta)
z = np.cos(phi)
# colormap
colormap = plt.cm.viridis
# Plot the d-orbitals in separate subplots
ax1.plot_surface(x * (dx2_minus_y2 - y**2), y * (dx2_minus_y2 - y**2), z * (dx2_minus_y2 - y**2), cmap=colormap, alpha=0.8)
ax1.set_title('d_x^2 - y^2')
ax1.axis('off')
ax1.plot_wireframe(x * (dx2_minus_y2 - y**2), y * (dx2_minus_y2 - y**2) , z * (dx2_minus_y2 - y**2) , color='gray', linewidth=0.1)
ax2.plot_surface(x * dz2, y * dz2, z * dz2, cmap=colormap, alpha=0.8)
ax2.set_title('d_z^2')
ax2.axis('off')
ax2.plot_wireframe(x * dz2, y * dz2, z * dz2 , color='gray', linewidth=0.1)
ax3.plot_surface(x * dyz.real, y * dyz.real, z * dyz.real, cmap=colormap, alpha=0.8)
ax3.set_title('d_yz')
ax3.axis('off')
ax3.plot_wireframe(x * dyz.real, y * dyz.real, z * dyz.real , color='gray', linewidth=0.1)
ax4.plot_surface(x * dxz.real, y * dxz.real, z * dxz.real, cmap=colormap, alpha=0.8)
ax4.set_title('d_xz')
ax4.axis('off')
ax4.plot_wireframe(x * dxz.real, y * dxz.real, z * dxz.real, color='gray', linewidth=0.1)
ax5.plot_surface(x * dxy.real, y * dxy.real, z * dxy.real, cmap=colormap, alpha=0.8)
ax5.set_title('d_xy')
ax5.axis('off')
ax5.plot_wireframe(x * dxy.real, y * dxy.real, z * dxy.real, color='gray', linewidth=0.1)
fig.suptitle('Spatial Orientation of d-Orbitals with XYZ Axes', y=1.02)
plt.tight_layout()
plt.show()
上图是我从剧情中得到的。我将它与我在网上找到的图片进行了比较:
有没有办法修复我的代码,以便我可以获得类似的数字?