Python 表付きグラフ(効率カーブ)
簡単な表と一体化した画像を作った。
作例
このグラフにおけるTips
作図領域を上下に分ける
drawfig1()
は下側のグラフ(作図領域の下側70%)、```drawfig2()''' は上川の表を描画する。
plt.axes((0.0, 0.0, 1.0, 0.7)); drawfig1() plt.axes((0.0, 0.7, 1.0, 0.3)); drawfig2()
白抜き記号描画
ms=8
:見号の大きさcolor='#000080'
:記号の色markerfacecolor='#ffffff'
:白抜きmarkeredgewidth=1
:記号輪郭の太さ
plt.plot(q_hmax,e_hmax,'s',ms=8,color='#000080',markerfacecolor='#ffffff',markeredgewidth=1,label='H=192.5m')
プログラム全文
import numpy as np import matplotlib.pyplot as plt from scipy.optimize import leastsq def reg(x,y): def func(param,x,y): a=param[0] b=param[1] c=param[2] return y - (a*(x-b)**2 + c) para0 =np.array([-1.0, 20.96, 89.65]) res = leastsq(func, para0, args=(x,y)) a=res[0][0] b=res[0][1] c=res[0][2] return a,b,c def drawfig1(): q_hmax=np.array([22.37,21.67,20.26,19.50,17.77,17.34,16.32,15.17,15.01,13.67,11.27]) e_hmax=np.array([89.48,89.45,89.23,88.96,88.18,87.87,87.14,86.23,86.07,84.98,81.82]) q_hnor=np.array([23.94,23.05,20.96,19.28,18.68,17.27,16.77,15.83,14.67,13.46,10.90]) e_hnor=np.array([89.53,89.64,89.65,89.17,88.94,88.10,87.73,87.04,85.97,84.86,81.53]) q_hmin=np.array([24.24,22.50,20.46,18.90,18.41,17.18,16.36,15.89,14.79,13.45,10.64]) e_hmin=np.array([89.27,89.62,89.60,89.12,88.80,88.05,87.39,86.99,85.91,84.78,81.07]) fsz=14 xmin=5 ; xmax=25; dx=5 ymin=75; ymax=95; dy=5 plt.xlim([xmin,xmax]) plt.ylim([ymin,ymax]) plt.xlabel('Turbine discharge per unit Qu (m$^3$/s)') plt.ylabel('Combined efficiency ef (%)') plt.xticks(np.arange(xmin,xmax+dx,dx)) plt.yticks(np.arange(ymin,ymax+dy,dy)) plt.grid(color='#999999',linestyle='solid') #plt.gca().set_aspect('equal',adjustable='box') #plt.title(tstr,loc='left',fontsize=fsz) x=q_hnor y=e_hnor a,b,c=reg(x,y) qmax=24.5 qmin=qmax*0.35 xx=np.arange(qmin,qmax,0.005) yy=a*(xx-b)**2+c ss='ef={0:6.3f}*(Qu-{1:6.3f})**2+{2:6.3f}'.format(a,b,c) print(np.min(yy)) print(np.max(yy)) plt.plot(xx,yy,'-',color='#000080',lw=2,label=ss) plt.plot(q_hmax,e_hmax,'s',ms=8,color='#000080',markerfacecolor='#ffffff',markeredgewidth=1,label='H=192.5m') plt.plot(q_hnor,e_hnor,'o',ms=8,color='#000080',markerfacecolor='#ffffff',markeredgewidth=1,label='H=180.0m') plt.plot(q_hmin,e_hmin,'^',ms=8,color='#000080',markerfacecolor='#ffffff',markeredgewidth=1,label='H=171.5m') plt.plot([qmax,qmax],[ymin,ymax],'--',color='#000080',lw=2) plt.plot([qmin,qmin],[ymin,ymax],'--',color='#000080',lw=2) xs=qmax; ys=ymin+0.02*(ymax-ymin); ss='Qu(max)={0:.1f}m$^3$/s'.format(qmax) plt.text(xs,ys,ss,ha='right',va='bottom',fontsize=fsz,rotation=90) xs=qmin; ys=ymin+0.02*(ymax-ymin); ss='Qu(min)=Qu(max) x 0.35' plt.text(xs,ys,ss,ha='right',va='bottom',fontsize=fsz,rotation=90) plt.legend(loc='upper left',shadow=True,fontsize=fsz-2) def drawfig2(): tstr='Design head setting (Q=49.0m$^3$/s)' row4=['Item','RWL','TWL','Margin','head loss','Value of head'] row3=['Maximum head','EL.284.5','EL.92.0','0.0m','0.0m', 'H=192.5m'] row2=['Nominal head','EL.284.5','EL.92.0','1.0m','11.5m','H=180.0m'] row1=['Minimum head','EL.275.0','EL.92.0','0.0m','11.5m','H=171.5m'] x=np.array([0.5,1.5,2.5,3.5,4.5,5.5]) y=np.array([0.5,1.5,2.5,3.5]) fsz=12 xmin=0 ; xmax=6 ymin=-0.5 ; ymax=5 plt.xlim([xmin,xmax]) plt.ylim([ymin,ymax]) plt.axis('off') for i in range(len(x)): for j in range(len(y)): if j==0: _row=row1 if j==1: _row=row2 if j==2: _row=row3 if j==3: _row=row4 ss=_row[i] plt.text(x[i],y[j],ss,va='center',ha='center',fontsize=fsz) plt.text(0.5*(xmin+xmax),4.5,tstr,va='center',ha='center',fontsize=fsz) for yy in [0,1,2,3,4]: plt.plot([xmin,xmax],[yy,yy],'-',color='#000000',lw=1) for xx in [0,1,2,3,4,5,6]: plt.plot([xx,xx],[0,4],'-',color='#000000',lw=1,clip_on=False) def main(): fnameF='fig_efficiency.jpg' plt.figure(figsize=(8,6),facecolor='w') plt.rcParams['font.family'] ='sans-serif' plt.rcParams['font.size']=14 plt.axes((0.0, 0.0, 1.0, 0.7)); drawfig1() plt.axes((0.0, 0.7, 1.0, 0.3)); drawfig2() plt.tight_layout() plt.savefig(fnameF, dpi=100, bbox_inches="tight", pad_inches=0.1) plt.show() #--------------- # Execute #--------------- if __name__ == '__main__': main()
以 上