使い慣れている分、確かに使い易い。
#coding:utf-8
"""
Gnuplot.pyが何故かeclipseで補完されない。
ライブラリに手動で設定したのだが。
何故か gnuplot_Suites が出てくる。
"""
import Gnuplot
import numpy as np
in_file='Data_all.txt'
in_txt_name='Data_GalacticPlane.txt'
out_file='Gnuplot_test.ps'
out_file2='Gnuplot_test2.ps'
"""
Pythonらしい?方法でファイル読み込み
"""
input_file=open(in_file,"r")
data_list=[]
Fe=[]
l=[]
line_data_cols=[4,7,10]
line_ids=[0,3,6]
for id in range(9):
Fe.append([])
for input_line in input_file:
if input_line.strip().split(',')[14]==' l':
l.append(float(input_line.strip().split(',')[2]))
for line_col_num in line_data_cols:
"""
line_id:
0-2 Fe I
3-5 Fe XXV
6-8 Fe XXVI
"""
line_id=line_col_num-4
value=float(input_line.strip().split(',')[line_col_num])
lower=float(input_line.strip().split(',')[line_col_num+1])
upper=float(input_line.strip().split(',')[line_col_num+2])
Fe[line_id].append(value*1e-7)
Fe[line_id+1].append(lower*1e-7)
Fe[line_id+2].append(upper*1e-7)
"""
numpyのloadtxtを使ってもう少し賢くやる
http://d.hatena.ne.jp/y_n_c/20091117/1258423212
を参考にする。
便利だが今回のようにデータを各行毎にチェックした上でplotしなくては
ならない場合は向かないのかもしれない。
l=-0.05のデータのみ抜き出したファイルを準備しておく。
"""
l_txt=np.loadtxt(in_txt_name, delimiter=',', usecols=[3],unpack=True)
"""
(np.)arrayとlistのどちらを使うべきかでよく混乱するが「自分の印象としては」
arrayは静的な数字そのものでlistは動的な変数。
・arrayにはappendはないけど、sin(array)みたいなことをやって、更にarrayを作れる。
・array*2=array[2*a,2*b]だが[a,b]*2=[a,b,a,b]
・そもそもarrayには数字以外は入らない。
"""
Fe_txt=[]
Fe_max_txt=[]
Fe_min_txt=[]
for id in range(3):
Fe_txt.append([])
Fe_max_txt.append([])
Fe_min_txt.append([])
l_txt=np.loadtxt(in_txt_name, delimiter=',', usecols=[2],unpack=True)
for num in range(3):
Fe_txt[num],Fe_min_txt[num],Fe_max_txt[num]=np.loadtxt(in_txt_name, delimiter=',', usecols=[3*num+4,3*num+5,3*num+6],unpack=True)
"""
Gnuplot.pyでプロット。
・Gnuplot.pyの正式なマニュアル
http://gnuplot-py.sourceforge.net/doc/
http://gnuplot-py.sourceforge.net/doc/Gnuplot/_Gnuplot/Gnuplot.html
http://www-acc.kek.jp/EPICS_Gr/products/gnuplot/Gnuplot_py.pdf
が日本語で詳しくて有り難い。
・withはpythonでは予約語なのでwith_を使う。
・Gnuplot.pyを使ってfittingも出来なくは無さそうだが、
今一つ頭が悪い感じ。少なくともpython内で定義した関数で
fitは出来そうにない。
http://osdir.com/ml/python.ipython.user/2003-07/msg00009.html
"""
"""
Python I/Oで読んだデータをプロット。
"""
gp1=Gnuplot.Gnuplot()
lw='3'
ps='1.5'
data1=[]
for num in range(3):
data1.append([])
for num in range(3):
if num==0:
line_name='Fe I K{/Symbol a}'
pt='7'
lt='0'
elif num==1:
line_name='Fe XXV K{/Symbol a}'
pt='6'
lt='1'
elif num==2:
line_name='Fe XXVI K{/Symbol a}'
pt='9'
lt='3'
"""
何故か titleだけ with_でなくてtitleでGnuplot.Dataに渡す。
"""
with_option='e lw '+lw+' pt '+pt
data1[num]=Gnuplot.Data(l,Fe[3*num],Fe[3*num+1],Fe[3*num+2],with_=with_option,title=line_name)
gp1('set key')
gp1('set log y')
gp1('set te unknown')
gp1.xlabel('Galactic longitude (degree)')
gp1.ylabel('Intensity (ph^{-1} cm^{-2} arcmin^{-2} s^{-1})')
gp1.title('Fe K{/Symbol a} profile along the Galactic plane')
gp1.plot(data1[0], xrange='[2.2:-3.2]', yrange='[1e-8:1e-5]')
for num in [1,2]:
gp1.replot(data1[num])
gp1('set format y "10^{%L}"')
gp1('set te po co solid enhanced "" 24')
gp1('set ou '+'"'+out_file+'"')
gp1.replot()
gp1('set ou')
"""
loadtxtで読んだデータをプロット。
"""
data2=[]
for num in range(3):
data2.append([])
for num in range(3):
if num==0:
line_name='Fe I K{/Symbol a}'
pt='7'
lt='0'
elif num==1:
line_name='Fe XXV K{/Symbol a}'
pt='6'
lt='1'
elif num==2:
line_name='Fe XXVI K{/Symbol a}'
pt='9'
lt='3'
with_option='e lw '+lw+' pt '+pt
data2[num]=Gnuplot.Data(l_txt,Fe_txt[num],Fe_min_txt[num],Fe_max_txt[num],with_=with_option,title=line_name)
gp1('set te unknown')
gp1.plot(data2[0], xrange='[2.2:-3.2]', yrange='[1e-1:1e2]')
for num in [1,2]:
gp1.replot(data2[num])
gp1.ylabel('Intensity (10^{-7} ph^{-1} cm^{-2} arcmin^{-2} s^{-1})')
gp1('set te po mono dashed enhanced "" 24')
gp1('set ou '+'"'+out_file2+'"')
gp1.replot()
gp1('set ou')
出来た図は下。割と綺麗。

