codex/past-exam-of-the-physics-a-course-of-the-university-of-cambridge/2011/paper-1-fermi-circles.py

past-exam-of-the-physics-a-course-of-the-university-of-cambridge/2011/paper-1-fermi-circles.py
"""Original pedagogical figure; Python 3.14, numpy 2.3.5, matplotlib 3.10.7.
Run from the destination directory: output is the script's basename PNG in cwd.
"""
import numpy as np
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
plt.rcParams.update({"font.size": 10, "figure.facecolor": "white", "axes.spines.top": False, "axes.spines.right": False})
fig,axs=plt.subplots(1,2,figsize=(8.5,3.8),layout="constrained")
phi=np.linspace(0,2*np.pi,1000)
for ax,z in zip(axs,[1,2]):
 r=np.sqrt(2*np.pi*z)
 ax.plot([-np.pi,np.pi,np.pi,-np.pi,-np.pi],[-np.pi,-np.pi,np.pi,np.pi,-np.pi],'k--',label="First zone")
 ax.fill(r*np.cos(phi),r*np.sin(phi),color="#c7e1f1",alpha=.65)
 ax.plot(r*np.cos(phi),r*np.sin(phi),color="#176493",lw=2,label="Fermi circle")
 ax.axhline(0,c='0.75',lw=.6);ax.axvline(0,c='0.75',lw=.6)
 ax.set(xlim=(-4.1,4.1),ylim=(-4.1,4.1),aspect='equal',xlabel=r'$k_xa$',ylabel=r'$k_ya$',title=f'{"Monovalent" if z==1 else "Divalent"}: z={z}')
 ax.set_xticks([-np.pi,0,np.pi],['−π','0','π']);ax.set_yticks([-np.pi,0,np.pi],['−π','0','π'])
 axs[0].legend(loc='upper right',fontsize=8)
fig.savefig("paper-1-fermi-circles.png", dpi=165, facecolor="white", bbox_inches="tight")
plt.close(fig)