codex/past-exam-of-the-algebra-analysis-and-differential-equations-2-course-of-the-university-of-oxford/2012-keyhole.py

past-exam-of-the-algebra-analysis-and-differential-equations-2-course-of-the-university-of-oxford/2012-keyhole.py
"""Original keyhole schematic. Python 3.14; numpy 2.3.5, matplotlib 3.10.7.
Run from the desired PNG output directory; writes 2012-keyhole.png to CWD.
"""
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(6.4, 5.2), facecolor='white')
R, rho, eps = 2.05, 0.32, 0.075
blue = '#1965a0'
theta = np.linspace(eps, 2*np.pi-eps, 600)
ax.plot(R*np.cos(theta), R*np.sin(theta), color=blue, lw=2)
ax.plot(rho*np.cos(theta), rho*np.sin(theta), color=blue, lw=2)
for sign in [1, -1]:
    ax.plot([rho*np.cos(eps), R*np.cos(eps)], [sign*rho*np.sin(eps), sign*R*np.sin(eps)], color=blue, lw=2)
for radius, angle, direction in [(R, 1.15, 1), (rho, 3.6, -1)]:
    start = angle-0.14*direction
    end = angle+0.14*direction
    ax.annotate('', (radius*np.cos(end), radius*np.sin(end)), (radius*np.cos(start), radius*np.sin(start)), arrowprops=dict(arrowstyle='->', color=blue, lw=2))
for sign, start, end in [(1, 0.9, 1.35), (-1, 1.35, 0.9)]:
    ax.annotate('', (end*np.cos(eps), sign*end*np.sin(eps)), (start*np.cos(eps), sign*start*np.sin(eps)), arrowprops=dict(arrowstyle='->', color=blue, lw=2))
ax.axhline(0, color='0.8', lw=0.8, zorder=0)
ax.axvline(0, color='0.8', lw=0.8, zorder=0)
ax.plot([0, 2.45], [0, 0], '--', color='#b23b38', lw=1.5)
ax.scatter([0, 0], [1, -1], marker='x', s=65, color='#b23b38', zorder=5)
ax.text(0.12, 1.03, r'$i$', fontsize=13)
ax.text(0.12, -1.15, r'$-i$', fontsize=13)
ax.text(0.9, 0.23, r'$\log x,\quad +\sqrt{x}$', fontsize=12)
ax.text(0.55, -0.48, r'$\log x+2\pi i,\quad -\sqrt{x}$', fontsize=12)
ax.text(-0.23, 0.02, r'$0$', fontsize=11)
ax.text(-0.62, 0.36, r'$\rho$', fontsize=12)
ax.text(-1.8, 1.2, r'$R$', fontsize=12)
ax.text(2.17, -0.15, r'$\mathrm{Re}\,z$', fontsize=11)
ax.text(0.12, 2.16, r'$\mathrm{Im}\,z$', fontsize=11)
ax.set_title(r'Keyhole contour: $0<\arg z<2\pi$', fontsize=14, pad=12)
ax.set_aspect('equal')
ax.set_xlim(-2.3, 2.7)
ax.set_ylim(-2.3, 2.45)
ax.axis('off')
fig.tight_layout()
fig.savefig('2012-keyhole.png', dpi=160, facecolor='white')