codex/pga-scission-and-fragment-loss.py

pga-scission-and-fragment-loss.py
"""Original repeat-unit bookkeeping model; run from _media to write PNG there."""
from pathlib import Path
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

labels=['Initial','After cuts','After short\nfragments leave']
units=np.array([1_000_000,1_000_000,980_000])
chains=np.array([1_000,10_000,8_000])
dp=units/chains
fraction=units/units[0]
fig,axes=plt.subplots(1,2,figsize=(8,3.4),dpi=120,layout='constrained')
fig.patch.set_facecolor('white')
fig.suptitle('Chain cuts and fragment loss measure different changes',fontsize=12)
colors=['#2463a6','#bd702b','#34835c']
for ax,data,title,ylim in zip(axes,[dp,fraction],['Number-average repeat units per chain','Retained repeat-unit mass fraction'],[(0,1180),(0,1.2)]):
 bars=ax.bar(np.arange(3),data,color=colors,width=.58)
 ax.set(xticks=np.arange(3),xticklabels=labels,title=title,ylim=ylim)
 ax.tick_params(axis='x',labelsize=9)
 for bar,v in zip(bars,data):
  text=f'{v:g}' if ax is axes[0] else f'{v:.0%}'
  ax.annotate(text,(bar.get_x()+bar.get_width()/2,v),xytext=(0,5),textcoords='offset points',ha='center',fontsize=10)
 ax.spines[['top','right']].set_visible(False)
 ax.grid(axis='y',alpha=.2);ax.set_axisbelow(True)
fig.savefig(Path('pga-scission-and-fragment-loss.png'),facecolor='white')