codex/past-exam-of-the-mathematical-methods-ii-course-of-the-university-of-oxford/2019-resit-semicircle-parabola-contour.py

past-exam-of-the-mathematical-methods-ii-course-of-the-university-of-oxford/2019-resit-semicircle-parabola-contour.py
"""Original oriented contour; Python 3.14 / NumPy 2.3.5 / Matplotlib 3.10.7.

The only output is Path.cwd()/Path(__file__).with_suffix('.png').name.
"""
from pathlib import Path
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np


def main():
    plt.rcParams.update({'font.family':'DejaVu Sans','font.size':11})
    fig,ax=plt.subplots(figsize=(5.5,5),dpi=120,facecolor='white');ax.set_facecolor('white')
    x=np.linspace(-1,1,500)
    ax.fill_between(x,x*x-1,np.sqrt(np.maximum(0,1-x*x)),color='#e6f0f7')
    t=np.linspace(0,np.pi,400)
    ax.plot(np.cos(t),np.sin(t),color='#256a9a',lw=2)
    ax.plot(x,x*x-1,color='#a65c2b',lw=2)
    for a,b in [(.65,.85),(2.15,2.35)]:
        ax.annotate('',xy=(np.cos(b),np.sin(b)),xytext=(np.cos(a),np.sin(a)),arrowprops={'arrowstyle':'-|>','lw':1.8,'color':'#256a9a','mutation_scale':15})
    for a,b in [(-.65,-.45),(.35,.55)]:
        ax.annotate('',xy=(b,b*b-1),xytext=(a,a*a-1),arrowprops={'arrowstyle':'-|>','lw':1.8,'color':'#a65c2b','mutation_scale':15})
    ax.scatter([-1,1],[0,0],s=25,color='#344f62',zorder=4)
    ax.axhline(0,color='#7e8a94',lw=.8);ax.axvline(0,color='#7e8a94',lw=.8)
    ax.text(0,1.14,r'$y=\sqrt{1-x^2}$',ha='center',color='#256a9a',fontsize=12)
    ax.text(0,-1.2,r'$y=x^2-1$',ha='center',color='#a65c2b',fontsize=12)
    ax.text(.1,.22,'D',fontsize=15,color='#344f62')
    ax.text(-1.08,.05,'(−1, 0)',ha='right',fontsize=9,color='#344f62')
    ax.text(1.08,.05,'(1, 0)',ha='left',fontsize=9,color='#344f62')
    ax.set(xlim=(-1.55,1.55),ylim=(-1.4,1.45),aspect='equal',xticks=[-1,0,1],yticks=[-1,0,1])
    ax.set_xlabel('x');ax.set_ylabel('y')
    ax.set_title('Counterclockwise semicircle–parabola contour',fontsize=12,pad=12)
    for spine in ax.spines.values():spine.set_visible(False)
    ax.tick_params(length=0,colors='#566e7c')
    fig.tight_layout(pad=1.2)
    fig.savefig(Path.cwd()/Path(__file__).with_suffix('.png').name,facecolor='white',transparent=False,metadata={'Software':'codex-wiki semicircle parabola contour'})
    plt.close(fig)


if __name__=='__main__':
    main()