エネルギーダイアグラム
大学の課題で必要だったので、エネルギーダイアグラムをmatplotlibで作りました。
以下にソースコードを載せます。物質名等はそれぞれ適当なものをお使いください。
#numpyとpyplotのimport import numpy as np import matplotlib.pyplot as plt #各物質名を配列で与える(今回は便宜的にアルファベット) name = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'] #LUMOのエネルギー準位(タプルでも配列でもかまいません) LUMO = (-5.7, -2.0, -2.11, -2.06, -2.9, -3.4, -2.7, -2.73) #(HOMOのエネルギー準位)ー(LUMOのエネルギー準位) height = (-3.8, -3.5, -3.53, -3.65, -2.9, -2.4, -2.4, -3.95) #プロットする領域の作成 fig = plt.figure(figsize = (8, 6)) ax = fig.add_subplot(1, 1, 1) ind = np.arange(8) width = 0.35 xgap = 0.3 #グラフの色用に0.0~0.7まで0.1刻みの配列を生成(任意) color = list(map(lambda x:x/10, np.arange(len(name)))) ''' ・パラメーターの補足 x座標は棒グラフのx座標を指定していますが、indは0〜7の配列、xgapは0.3、 また幅(width)は0.35なので、棒グラフは右から 0.3から0.65を塗りつぶす 1.3から1.65を塗りつぶす … となっていきます。 bottomを指定することでその部分から棒グラフを作ります。 例) bottom = 10, 高さ = 10 ならy座標が10のところから更に10、つまり10〜20で棒グラフを作ります。 ''' ax.bar(ind+xgap, height, width, bottom = LUMO, color = plt.cm.hsv(color), alpha = .5, edgecolor = 'w') #graphの枠を消す sihou = ('top', 'bottom', 'right', 'left') for i in sihou: ax.spines[i].set_visible(False) #Y軸についての設定 ax.yaxis.set_ticks_position('left') #Y軸の座標を左のみ表示 ax.set_yticks(np.arange(10)-10) #Y軸の目盛りの位置 ax.set_yticklabels((np.arange(10)-10)) #Y軸の目盛りのラベルの設定 ax.set_ylabel('Energy (eV)') #Y軸のラベルの設定 #X軸についての設定 ax.xaxis.set_ticks_position('none') #X軸の目盛りを上下ともに非表示 ax.set_xticks(ind+xgap+width/2) #X軸の目盛りの位置 ax.set_xticklabels(name) #X軸の目盛りのラベルの設定 #HOMOの数値の表示 for x, y1, y2 in zip(ind+width/2+xgap, height, LUMO): ax.text(x, y1+y2, '%.2f'%(y1+y2), ha = 'center', va = 'top') #LUMOの数値表示 for x, y in zip(ind+xgap+width/2, LUMO): ax.text(x, y-0.03, '%.2f'%(y), ha = 'center', va = 'bottom') plt.show() #画像として保存したい場合はplt.show()の代わりにsavefigメソッドで保存できます。以下に例を書きます。 #plt.savefig(filename = 'sample.png', dpi = 600)
実際に実行してみるとこのような図が得られると思います。