使い慣れている分、確かに使い易い。
#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')
出来た図は下。割と綺麗。