Evidence

make family connections.py

Download source fileOpen in research workspace
"""Exact four-panel explanatory figure; native SVG plus PNG preview."""
from pathlib import Path
from fractions import Fraction as F
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib.patches import FancyBboxPatch, FancyArrowPatch

OUT=Path(__file__).resolve().parent
E,P,J=F(25,23),F(70,69),F(300,299)
assert [4251-1885,4244-1878,4237-1871]==[2366]*3
assert [E*F(69,2)*336,P*F(69,2)*360,J*F(69,2)*364]==[12600]*3
assert [9660+2940,P*9660+2940,E*9660+2940]==[12600,12740,13440]
assert [4346+9660,4346+P*9660,4346+E*9660]==[14006,14146,14846]
assert 14004-J*(14004-1446)==1404

plt.rcParams.update({'font.family':'DejaVu Sans','svg.fonttype':'none','font.size':16})
BG='#F3F6FA';INK='#172D43';MUTED='#52677A';LINE='#C9D5E1';BLUE='#235E89';TEAL='#087B7C';ORANGE='#A75622';PURPLE='#69518B'
fig=plt.figure(figsize=(17,12),facecolor=BG)
fig.text(.045,.954,'How the chronological families connect',color=INK,fontsize=28,weight='bold')
fig.text(.045,.918,'Shared operations, with source roles and units preserved',color=MUTED,fontsize=17)

def panel(rect,title,num):
 ax=fig.add_axes(rect);ax.set_xlim(0,1);ax.set_ylim(0,1);ax.axis('off')
 ax.add_patch(FancyBboxPatch((.006,.006),.988,.988,boxstyle='round,pad=0,rounding_size=.025',facecolor='white',edgecolor=LINE,lw=1.3))
 ax.text(.035,.935,f'{num}',fontsize=17,weight='bold',color='white',ha='center',va='center',bbox=dict(boxstyle='circle,pad=.3',fc=BLUE,ec='none'))
 ax.text(.075,.936,title,fontsize=20,weight='bold',color=INK,va='center')
 return ax
def text(ax,x,y,s,size=17,color=INK,ha='center',weight='normal',**kw):
 return ax.text(x,y,s,fontsize=size,color=color,ha=ha,va='center',weight=weight,**kw)
def arrow(ax,p1,p2,color=LINE,lw=1.8):
 ax.add_patch(FancyArrowPatch(p1,p2,arrowstyle='-|>',mutation_scale=15,lw=lw,color=color,shrinkA=0,shrinkB=0))
def box(ax,x,y,w,h,color='#ECF3F8',edge='none'):
 ax.add_patch(FancyBboxPatch((x,y),w,h,boxstyle='round,pad=0,rounding_size=.015',facecolor=color,edgecolor=edge,lw=1))

a=panel([.035,.495,.45,.38],'Creation and Joseph: translated rails','1')
text(a,.5,.878,'Restored-Cainan Creation · Joseph Plenty/Famine',12,color=MUTED)
text(a,.27,.827,'Creation (BC)',16,color=MUTED,weight='bold')
text(a,.75,.827,'Joseph (BC)',16,color=MUTED,weight='bold')
for yy,c,q in zip([.73,.585,.44],[4251,4244,4237],[1885,1878,1871]):
 text(a,.27,yy,str(c),25,color=BLUE,weight='bold')
 text(a,.75,yy,str(q),25,color=TEAL,weight='bold')
 arrow(a,(.365,yy),(.647,yy),BLUE)
 text(a,.505,yy+.048,'−2366 years',14,color=BLUE)
for xx in [.115,.91]:
 for yy in [.656,.512]:text(a,xx,yy,'7',15,color=MUTED)
text(a,.50,.318,'T = 2366 years  •  matching positions',15,color=MUTED)
for x,role,formula,pair in [(.035,'Exposure','T − 26 = 2340','4238 → 1898'),(.354,'Covering','T − 14 = 2352','4237 → 1885'),(.673,'Corresponding','T = 2366','4251 → 1885')]:
 box(a,x,.05,.292,.205)
 text(a,x+.146,.212,role,14,color=MUTED,weight='bold')
 text(a,x+.146,.145,formula,16,color=INK,weight='bold')
 text(a,x+.146,.09,pair,13,color=MUTED)

b=panel([.515,.495,.45,.38],'Micro scale: one calendar volume','2')
text(b,.5,.817,'Input s = 34.5  ·  phase scalar',18,color=INK,weight='bold')
text(b,.205,.711,'Key',14,color=MUTED)
text(b,.493,.711,'Converted count × calendar days',14,color=MUTED)
for yy,k,eq in [(.60,'E = 25/23','37.5 × 336'),(.43,'P = 70/69','35 × 360'),(.26,'J = 300/299','(450/13) × 364')]:
 box(b,.055,yy-.055,.272,.112,'#F1EDF7')
 text(b,.191,yy,k,17,color=PURPLE,weight='bold')
 arrow(b,(.339,yy),(.397,yy),PURPLE)
 text(b,.558,yy,eq,19,color=INK,weight='bold')
 arrow(b,(.716,yy),(.781,.43),TEAL)
box(b,.793,.302,.171,.25,'#E6F3F2')
text(b,.878,.462,'12600',23,color=TEAL,weight='bold')
text(b,.878,.389,'days',17,color=TEAL)
text(b,.5,.087,'336 E = 360 P = 364 J = 8400/23',17,color=MUTED)

c=panel([.035,.075,.45,.38],'Macro scale: retain the lower arm','3')
text(c,.5,.823,'Upper arm changes; 4346 → 1406 stays 2940 years',15,color=MUTED)
text(c,.20,.714,'Upper arm',15,color=MUTED,weight='bold')
text(c,.472,.714,'Fixed arm',15,color=MUTED,weight='bold')
text(c,.657,.714,'Total years',15,color=MUTED,weight='bold')
text(c,.86,.714,'Head (BC)',15,color=MUTED,weight='bold')
for yy,k,upper,total,head,role,col in [(.583,'Identity',9660,12600,14006,'native',BLUE),(.40,'P',9800,12740,14146,'generated',ORANGE),(.217,'E',10500,13440,14846,'generated',ORANGE)]:
 box(c,.035,yy-.072,.93,.142,'#F3F6FA')
 text(c,.08,yy+.008,k,14,color=PURPLE,weight='bold')
 text(c,.238,yy+.008,str(upper),21,color=INK,weight='bold')
 text(c,.359,yy+.008,'+',18,color=MUTED)
 text(c,.472,yy+.008,'2940',21,color=INK)
 text(c,.568,yy+.008,'=',18,color=MUTED)
 text(c,.657,yy+.008,str(total),21,color=TEAL,weight='bold')
 text(c,.86,yy+.015,str(head),22,color=col,weight='bold')
 text(c,.86,yy-.035,'native Rounded' if role=='native' else role,12,color=col)
text(c,.5,.075,'Head = 4346 + transformed upper arm',15,color=MUTED)

d=panel([.515,.075,.45,.38],'Actual to Rounded: an endpoint bridge','4')
text(d,.5,.823,'Cumulative pairs (BC); J expands with Creation held',15,color=MUTED)
cols=[(.165,'Actual',BLUE),(.5,'J image',PURPLE),(.835,'Rounded',TEAL)]
for x,label,col in cols:
 text(d,x,.728,label,18,color=col,weight='bold')
 box(d,x-.127,.322,.254,.342,'#F2F6FA')
for x,head,tail,tailrole,col in [(.165,14004,1446,'Exodus',BLUE),(.5,14004,1404,'generated image',PURPLE),(.835,14006,1406,'Conquest',TEAL)]:
 text(d,x,.607,str(head),24,color=col,weight='bold')
 text(d,x,.555,'Creation',13,color=MUTED)
 text(d,x,.447,str(tail),24,color=col,weight='bold')
 text(d,x,.391,tailrole,12,color=MUTED)
arrow(d,(.297,.49),(.367,.49),PURPLE)
text(d,.332,.548,'J',17,color=PURPLE,weight='bold')
arrow(d,(.632,.49),(.702,.49),TEAL)
text(d,.667,.564,'+2',17,color=TEAL,weight='bold')
text(d,.667,.527,'both',12,color=TEAL)
for x,span in [(.165,'12558'),(.5,'12600'),(.835,'12600')]:
 text(d,x,.253,span+' years',18,color=MUTED,weight='bold')
text(d,.5,.133,'J × 12558 = 12600',18,color=INK,weight='bold')
text(d,.5,.072,'Creation changes +2; the terminal changes −40.',14,color=MUTED)

fig.text(.045,.027,'Exact arithmetic. Calendar-day volumes and chronological-year spans remain distinct realizations.',fontsize=14,color=MUTED)
fig.savefig(OUT/'family_connections.svg',format='svg',facecolor=BG)
fig.savefig(OUT/'family_connections.png',format='png',dpi=160,facecolor=BG)
plt.close(fig)
print(str(OUT/'family_connections.svg'))
print(str(OUT/'family_connections.png'))
Edition and provenance

make_family_connections.py

SHA-256 bc451dbe63542bac81c08257b4363f938f7faa8e86e0c7e4d8178e90dceb1ad3

C480–C1634/Research_Cycles/C0632_C0731/prep/make_family_connections.py