from pathlib import Path
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib import font_manager
ROOT=Path(__file__).resolve().parents[1]; out=ROOT/'outputs'; out.mkdir(exist_ok=True)
names={f.name for f in font_manager.fontManager.ttflist}
font=next((f for f in ['Microsoft YaHei','SimHei','Noto Sans CJK SC'] if f in names),None)
if font:
    plt.rcParams['font.sans-serif']=[font]; plt.rcParams['axes.unicode_minus']=False
else:
    print('No CJK font: English labels used.')
a=np.array([1.,2.,2.,3.,8.,9.]); b=np.array([2.,3.,4.,5.,6.,7.])
edges=[0,3,6,10]; counts,_=np.histogram(a,bins=edges)
assert counts.tolist()==[3,1,2]
fig,axs=plt.subplots(2,2,figsize=(9,6),layout='constrained')
axs[0,0].hist([a,b],bins=edges,label=['A','B'],alpha=.7)
axs[0,0].set(title='Common bin edges',xlabel='Amount',ylabel='Count'); axs[0,0].legend()
axs[0,1].boxplot([a,b],tick_labels=['A','B'])
axs[0,1].set(title='Median / quartiles / 1.5 IQR whiskers',ylabel='Amount')
means=[a.mean(),b.mean()]; sd=[a.std(ddof=1),b.std(ddof=1)]
axs[1,0].errorbar([0,1],means,yerr=sd,fmt='o',capsize=5)
axs[1,0].set(xticks=[0,1],xticklabels=['A','B'],title='Mean ± sample SD',ylabel='Amount')
x=np.arange(1,5); y=np.array([2,6,9,5]); peak=int(y.argmax())
axs[1,1].plot(x,y,marker='o')
axs[1,1].annotate('Peak',xy=(x[peak],y[peak]),xytext=(0,10),textcoords='offset points',ha='center')
axs[1,1].set(title='Peak annotation',xlabel='Day',ylabel='Orders',ylim=(0,12))
path=out/'mpl-subplots.png'; fig.savefig(path,dpi=150,bbox_inches='tight'); plt.close(fig)
assert path.stat().st_size>1000 and peak==2
print('hist counts',counts.tolist(),'means',means,'sample SD',sd)
print('saved',path.name)
