如何在Python中绘制这些晶体场d轨道

问题描述 投票:0回答:1

正如问题所说,我试图使用 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()

上图是我从剧情中得到的。我将它与我在网上找到的图片进行了比较:

有没有办法修复我的代码,以便我可以获得类似的数字?

python matplotlib plot figure
1个回答
0
投票

我假设您想修复宽高比。例如,如果您使用

ax1.get_xlim3d()
ax1.get_ylim3d()
ax1.get_zlim3d()
访问 x、y 和 z 限制,您可以看到它们是不同的。您可以使用
ax1.set_aspect('equal')
设置宽高比。在每个代码块后面添加这一行,并将
ax1
更改为
ax2
等等,我得到了这个图,它看起来有点像你想要的。

此外,如果您用

$
包围文本,则可以将 LaTeX 添加到文本中,例如
ax1.set_title(r'$d_{x^2 - y^2}$')
。不要忘记将其设为原始字符串,这样某些 LaTeX 命令就不会被错误地解释为转义字符。

© www.soinside.com 2019 - 2024. All rights reserved.