エネルギーダイアグラム

Pythonソースコードを載せてみようかと思います。

大学の課題で必要だったので、エネルギーダイアグラムを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)

f:id:jinpei0908:20160805231253p:plain

実際に実行してみるとこのような図が得られると思います。