codex/arcsine-circle-projection-and-density.py

arcsine-circle-projection-and-density.py
"""Original uniform-circle projection and arcsine density; output PNG to cwd."""
from pathlib import Path
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt


def main():
    plt.rcParams.update({'font.size':12,'figure.facecolor':'white','axes.facecolor':'white'})
    fig,(ax,bx)=plt.subplots(1,2,figsize=(10.6,4.9),layout='constrained')
    theta=np.linspace(0,2*np.pi,601)
    ax.plot(np.cos(theta),np.sin(theta),color='#597a96',lw=1.7)
    phase=2*np.pi*(np.arange(24)+.5)/24
    x,y=np.cos(phase),np.sin(phase)
    for xx,yy in zip(x,y):ax.plot([xx,xx],[yy,0],color='#6b8eac',lw=.8,alpha=.42)
    ax.scatter(x,y,s=30,color='#315e80',zorder=4)
    ax.scatter(x,np.zeros_like(x),s=30,color='#bd6d17',zorder=5)
    ax.plot([-1,1],[0,0],color='#734a22',lw=2)
    ax.axvline(0,color='#a3abb0',lw=.7)
    chosen=5;xx,yy=x[chosen],y[chosen]
    ax.annotate('Horizontal projection',(xx,0),xytext=(-1.16,-1.20),fontsize=11,
                arrowprops={'arrowstyle':'->','color':'#8b521d'},color='#8b521d')
    ax.text(-1.13,1.12,'Equal angle steps; unequal horizontal steps',fontsize=10)
    ax.set(xlim=(-1.28,1.28),ylim=(-1.35,1.35),aspect='equal',xlabel=r'$Y=\cos\Phi$',ylabel='Vertical circle coordinate',
           title='Uniform angle on a unit circle')
    z=np.linspace(-.999,.999,1001)
    density=1/(np.pi*np.sqrt(1-z*z))
    bx.plot(z,density,color='#74549b',lw=2.6)
    bx.axvline(-.5,color='#ae7e3f',ls='--',lw=1.1);bx.axvline(.5,color='#ae7e3f',ls='--',lw=1.1)
    bx.fill_between(z,0,density,where=np.abs(z)>.5,color='#e3b66e',alpha=.42)
    bx.text(-.93,1.58,r'$f_Y(y)=1/(\pi\sqrt{1-y^2})$',fontsize=14)
    bx.text(-.84,.88,'Outside [-1/2, 1/2]:\n2/3 of the probability',fontsize=11,
            bbox={'fc':'white','ec':'none','alpha':.9,'pad':3})
    for end in [-1,1]:
        bx.annotate('',xy=(end,1.88),xytext=(end,1.67),arrowprops={'arrowstyle':'->','color':'#74549b','lw':1.5})
    bx.set(xlim=(-1.05,1.05),ylim=(0,2.0),xlabel='Projected position y',ylabel='Probability density per unit y',
           title='More probability near the two ends')
    bx.grid(alpha=.16)
    fig.savefig(Path(__file__).with_suffix('.png').name,dpi=120,facecolor='white')
    plt.close(fig)


if __name__=='__main__':main()