メインコンテンツに移動

汎用人型決戦スクリプト draw.sh

汎用データ処理スクリプト

PlotUtilsを直接使っていると,オプションがたくさんあって面倒なので,汎用スクリプトを開発する.そりゃ締め切り間際で忙しいときに,図のお飾りなんかやってらんねーしな

動作可能なOS: Windows以外

バージョンごとにバグがたくさん無くなるので, 最新型を使ってね

  • 【ソース】【クローンを作成】をクリックして表示されるコマンドを実行するの

目次

基本の使い方

ここいらへんから, PlotUtilsおよびgawkをインストールする. このへんでGhostScriptをインストールする.ソフトの最新型をダウンロードして, フォルダーに配置する.

あ!そこのお転婆さん,draw.sh を編集しようなんて思ってますね?こいつはソフト本体で巨大(300行)ですので編集しないでくださいね.
あなたが作成するソフトは,ずっと簡単なもののはず,です

そしてターミナルで

$ bash ./draw.sh init

これにより, 初期ファイル my.sh とmy.datが作成される. あなたの数値データがmy.datであり,あなたが作成していくべき描画プログラムが my.sh である.デフォルトでは, my.dat からXY座標を読み取り, my.pdf を作成する. X軸の範囲は[0:1], Y軸の範囲は[-1:1]である. 別のデータを描画したり,座標範囲が気に入らない場合, my.sh を編集して訂正すれば良い. my.sh を実行すると, my.pdf が作成される:

$ ./my.sh                                  
$ open my.pdf

my.pdf

この my.sh で何をしているか解読

エディターでmy.shを開いてみましょう. では,この中身を解説します.こいつは, あなたが計算するであろうデータ my.dat を描画する例である.この例では,うっかり5点しかデータを採らなかった.怒られるのが嫌なので, スプライン関数で増やしちゃおうって腹である:

# 1時間だけ存在する一時フォルダーを作ります                                 
TMP=`mktemp -dt my`                                 
# 元のデータが粗っぽいので,ごまかします                                 
spline my.dat >$TMP/fine.dat

こんな作業が不要な場合は上の spline 行を消して, 下で fine.dat を描画しているのを消せば良い:

# ほんじゃ,描いてみようか                                
draw my.pdf  $TMP/fine.dat  my.dat

容易に想像できるように, この行の最初は出力ファイル名2番目から先は,データファイル名であって,ファイルの数だけ絵を描く.描くのに用いる線やマーカーの種類は

LINE=( Solid:Black Omit:Black Solid:Blue )                                
SYMBOL=( Omit WhiteCircle:Red Omit )

ファイルごとに順番に使われていく. つまりこの例では,

  • 最初の $TMP/fine.dat は Solid:Black 線で描き,マーカーはOmit
  • 二番目の my.dat は 線はOmit, マーカーは WhiteCircle:Red で描く.

実は Solid:Black:0.002 と書くと, 線の太さが0.002になる. SYMBOLでも WhiteCircle:Red:0.04 と書くと, シンボルの大きさが0.04になるという噂もある.この不思議な数値は, 図の縦幅に対する比率?と推測している.

途中にあるこのあたりは, 凡例を描いているだけなので,凡例がいらないなら不要:

# ラベルを作成します                              
cat > $TMP/legend.dat <<@                              
#m=Solid:Black,S=Omit                              
 ....                               
0.55 0.6 l:\r2\r4 experiment                              
                             
LEGEND=$TMP/legend.dat

初めての人は,

cat > ファイル名 <<@                             
なんとか かんとか                             
@

というのに驚くかもしれませんね.これは,内容が「なんとか,かんとか」というファイルを作る,普通のLinux/OSXの命令です.

いろいろなグラフを作成する場合, デフォルトのmy.shのファイル名は変更しておいたほうが良い(新規作成できなくなるからね):

   $ mv my.sh fucking_figure.sh

ん?PDFじゃなくてEPSが良いのか.馬鹿だなぁ.でも欲しいなら

   $ pdf2ps my.pdf my.eps

で十分でしょ.え?JPEGが欲しいんだって?まさかお前,PowerPoint使っているのか.my.pdf をプレビューして【ファイル】【書き出せ】

え?なにか文字とか追加したいのか.そんなん,my.pdf をプレビューして【ツール】【注釈】でどうぞ

my_0 Macのプレビューって,まじで,なんでもできるのよねー

座標軸

座標軸の範囲は,

X_RANGE='0.00 1.00 0.25'                            
Y_RANGE='-1.00 1.00 0.5'

で設定します.最小値最大値目盛間隔,の順に数値を指定します.

座標軸の文字列を変更しましょう.これは

X_AXIS='your X-axis'                               
Y_AXIS='\*c\mk\sb\fR1\eb\rt\sp2\ep'

のところに,描く文字列を入れれば,描画されます.Y_AXISに設定されているハナモゲラ文字については,ここを参照.あ?Y座標がおねんねしているのが気に入らない人は,

OPT="--toggle-rotate-y-axis"

しましょう.この OPT っていう変数は,GNUPlotUtilsの様々なオプションをまとめて記入するものです.複数を指定したい場合,スペースを空けて続けて記入してください:

OPT="--toggle-rotate-y-axis --pen-colors=1=Goldenrod:3=DarkViolet"

draw.shは,この忌々しいOPT命令のツラを見たくないという目的で開発されました.つまり,OPT変数なしでも,そこそこ,満足できる図が作成できるはず,です.ですが,あくまでも,そこそこ,です.

線やマーカーの種類

LINESYMBOLで利用出来る,線やマーカの種類を示します.

LINE Omit Solid Dot DotDash
Dash LongDash DotDotDash DotDotDotDash
SYMBOL Omit Dot Plus Star
HollowCircle FilledCircle WhiteCircle HollowSquare
HollowDiamond FilledDiamond WhiteDiamond HollowNabla
PlusTarget CrossTarget Lockon Target
FilledSquare WhiteSquare HollowDelta FilledDelta
WhiteDelta FilledNabla WhiteNabla  

SYMBOLは下の数字でもOK:


複数コラムのデータ

あなたのデータファイルが                                         
X Y1 Y2 Y3 ....

ってな感じである場合には,

get_pair 1 2 < my.dat > $TMP/Y1.dat      

これは, my.dat から1コラム目と2コラム目を取り出してY1.datを作成する.X Y1 という形のファイルになります.X Y2のデータが欲しけりゃ

get_pair 1 3 < my.dat > $TMP/Y2.dat

ほんで最後に

draw my.pdf $TMP/Y1.dat $TMP/Y2.dat  

これでY1.datとY2.datが描画される. av_SM()で移動平均したりleast_2()で最小自乗直線を得たり, get_MV()でエッジ検出したりも可能.

データのコラム間計算

gawkを用いると,エクセルのように, データのコラム間の計算を簡単に記述できます.例えば, 

X Y1 Y2 Y3

コラムから構成されるデータ my3.dat から, Y1+Y3を描画したい場合には, 

gawk '{            ← gawkプログラムを起動                          
   printf("%e %e\n", $1, $2+$4); ← C*言語, Java*言語でお馴染みのprintf                          
}' < my3.dat > $TMP/Y1_plus_Y3.dat        ← 入力は my3.dat  出力は一時ファイル                          
# ほんじゃ,描いてみようか                          
draw my.pdf $TMP/Y1_plus_Y3.dat ← 上で保存したファイルを描画

によって,一時ファイル $TMP/Y1_plus_Y3.dat を作成し, my.pdf に作図します.計算においては, 変数を用いたり,if文による条件判断や, 乱数など種々の数学関数を利用できます:

X=$1; Y1=$2; Y2=$3; Y3=$4;                          
printf("%e %e\n", X, Y2+cos(Y1-Y4));

文字列を入れたい

グラフの中に文字列を入れたいですって?それは簡単です.draw.shはデータフォーマット「legend(凡例)」がデフォルトなので,データファイルに文字を書けば描画されます.

  1. 描くデータファイルに書き込んでしまう方法
    • データファイルで,文字を入れたいデータの行に,次のように記入します:

      0.200000 0.960845                          
      0.400000 0.670228                          
      0.600000 -0.270228    lb:\*g\sb1\eb                           
      0.800000 -0.560845

      この例では, (0.6, -0.27) の近くに文字が記入されます.「lb」はLeftBottomのことで,文字列の左下の座標が(0.6,-0.27)になるということです.

      同様に, r(Right), t(Top)も利用できます.指定がない場合,文字列の中央が座標になります.例えば

      0.600000 -0.270228  :\*g\sb1\eb

      この場合,文字列の縦横の中央が(0.6, -0.27)になります.

  2. 凡例ファイルに記入してしまう.
    • 後で説明する凡例ファイルに記入しても良いです.例えば

      #m=Solid:Black,S=Omit                         
      0.600000 -0.270228                         
      0.8 0.3  l:\*g\sb1\eb

      と記入すると,(-0.6,-0.27)から(0.8,0.3)まで引き出し線を描いたのち,文字列の左端が(0.8,0.3)になるように文字列を記入します.

記入する文字列が奇妙ですって?それは,数式を入れるためです.普通のアルファベットや数字は,そのまま記入されます.\で始まるのがコマンドで, 例えば

\*アルファベット 

では,対応するギリシャ文字が入ります.\sbはsubscript(下付き)始まり,\ebは終わり.\spはsuperscript始まりで\epで終わります.詳細は,こちらをどうぞ

カラー

色刷りにしたい場合, drawする前に

COLOR=1

をつけます.色の指定は,LINESやSYMBOLSに :色の名前 をつけます. 一度に使える色は6色までです:

Red Green Blue Magenta Cyan Black
1番 2番 3番 4番 5番 6番

ただし,上の6つは「名称」であって,Redの初期値が赤色に設定されているだけです.実際の表示色は,色の名前を用いて次のように変更できます:

COLOR=1                      
OPT="--pen-colors=1=Goldenrod:3=DarkViolet"

この例では, 1番管の色をGoldenrodに,3番管の色をDarkViolet に変更しています.このとき, Solid:Red で描け,と指示すると,Goldenrod色で表示されます.

凡例これなに

凡例は,LEGEND変数に凡例ファイルを指定すれば描画されます:

LEGEND=凡例ファイル名

すると凡例ファイルに何が書いてあるのか,が問題になるわけです.こんな感じです:

my_1

#m=Solid:Black,S=Omit                  ← #m=線の凡例 # 種別:色,S=Omit                       
0.5 0.75                                            ← 凡例の線の始点                      
0.6 0.75 l: theory                              ← 終点 # 空白+場所: 文字列                      
#m=Omit,S=WhiteCircle:Red          ←#m=マーカーの凡例ではOmit,S=種別:色                      
0.55 0.6 l:\r2\r4 experiment            ← マーカーの座標.空白+場所: 文字列

なんか普通にデータファイルです. ですので, 例えば

 #m=Solid:Black,S=Omit                    
0.4 0.6                    
0.5 0.6                    
0.5 0.3                    
0.4 0.3                    
0.4 0.6

などと記入すると,データファイルと同じように線を描くことができます.

となると,凡例ファイルでいろんな記号をお絵描きできることになります.ですが座標が面倒ですよね.そんなあなたに

UNIVERSAL_LEGEND=1

こうすると,凡例ファイルの座標系が xが[0,1], yが[0,1]になります.図のデータと関係がなくなるので,絵柄は絵柄で,データファイルの座標と無関係に描くことができます.

UNIVERSAL_LEGENDが対数グラフでバグっていると言う噂を聞きました.そんな場合は

LEGEND_OPT="-ly"

とかで対数になっている軸の対数指定をキャンセルすると良いかもしれないです.

対数グラフ

本座標軸を対数にするには, OPT変数に -l x とか -l y を追加します.該当する座標が対数になります.この時,描画範囲に0が入らないように注意してくださいね.

図の縦横比

ASPECT変数で指定します. デフォルトが0.6で・・・どういうわけか, この時には正方形です.数値を小さくすると横長にはなります:

ASPECT=0.3

my_2

文字の大きさなど

文字列のフォントやサイズは

FONT_NAME=Times-Roman                     
FONT_SIZE=0.075

と指定します.ただし,利用可能なフォントは限られています:

AvantGarde-Demi AvantGarde-Book
Bookman-Light Bookman-LightItalic
Bookman-Demi Bookman-DemiItalic
Courier Courier-Oblique
Helvetica Helvetica-Oblique
Helvetica-Narrow Helvetica-Narrow-Oblique
Palatino-Roman Palatino-Italic
NewCenturySchlbk-Roman NewCenturySchlbk-Italic
Times-Roman Times-Italic

フォントのサイズは図の縦長さに対する比率です.

線の太さ・マーカーの大きさ

これらは

SYMBOL_SIZE=0.05                    
LINE_WIDTH=0.003

で調整します.

データの行間計算

gawkを用いると,データの行間計算を簡単に記述できます.例えば,

gawk 'BEGIN{                     ← データファイルを読み込む前に, BEGIN{}の内容が実行されます.                   
    SUM=0; COUNT=0;                
}{                                         ← データファイルを読みながら{}の内容を実行します                   
    if (NR==1) XMIN=$1; XMAX=$1;         ← これで, 第1コラムの最初と最後の値が得られます.                   
    SUM=SUM+$2; COUNT=COUNT+1;  ← 第2コラムの平均値を計算しているわけです.                   
}END{                                 ← データファイルが終了したら, END{}の内容が実行されます.                   
    AVERAGE=SUM/COUNT;                   
    printf("%e %e\n",XMIN,AVERAGE);                   
    printf("%e %e\n",XMAX,AVERAGE);                   
}' < my.dat > $TMP/AVERGE.dat                ← 入力は my3.dat  出力は一時ファイルに保存

このプログラムでは, 平均値で始点と終点を結ぶ,というデータファイルが作成できるわけです.ですので

# ほんじゃ,描いてみようか                
draw my.pdf my.dat  $TMP/AVERAGE.dat  ← 結果と平均値を描画する

上の例で示した以外にも, gawkはプログラム言語の機能をほぼ全部持っていますので,データファイルを元に,かなりの数値計算を実行できます.高速・・・ではないけれど

おかわりI: 縦軸の数値が異なる

一つの図に,縦軸のレンジが異なるデータを同時に表示したい場合もあります.これは簡単. NEWPLOT変数を用いて,新しい図を描けばよろしい:

NEWPLOT=( 3 5)                           ← 最初(図0)の縦軸で3ファイル描き, 5番目のファイルを描くまでは図1になります               
Y_RANGE[1]="-0.5 1.5 0.5"           ← 縦軸が異なる場合, [図の番号]をつけて設定します.               
# 目盛りの数や配置を0図と一致させておかないと,不潔な図が完成してしまいますので注意               
Y_AXIS[1]="ion current (\*mA)"    ← え?じゃあ上のY_RANGE=...は実はY_RANGE[0]=....と同じ!デフォルトが[0]               
OPT[1]="-g 1 --pen-colors=4=DarkGreen"            ← オプションも指定できます

OPT[1]の"-g 1"を省略すると, 2枚目の図の軸ラベルが省略されます.凡例は図ごとに設定されますので, 別の凡例を作りたければ,例えば

# 2枚目のラベルを作成します               
cat >$TMP/legend1.dat <<@               
#m=Solid:Magenta,S=Omit               
0.1 -.3 0.1 -.2               
         ← 空行があれば,「別の曲線を開始する」ことになります.               
0.1 -.25 0.35 -.25 t:\fRlight on               
0.6 -.25               
0.6 -.3               
0.6 -.2               
0.1 0.1 lt:\fRion current               
@               
LEGEND[1]=$TMP/legend1.dat

こんな感じで別の凡例を指定してあげれば良いです.普通に描けば,描画されます:

# ほんじゃ,描いてみようか draw my.pdf $TMP/fine.dat my.dat my2.dat my3.dat

my_3

この図では,赤マーカーの上に,2枚目の座標軸が描かれて不細工ですね.この例では,2枚目と1枚目を描く順番を変えなければ,どうしようもないでしょうね・・・

2枚目の縦軸は,右側に表示されています. では,3枚目の縦軸はどこに表示されるのかな?

残念ながら,現在のPDF仕様には余剰次元,すなわち宇宙を構成する時間と空間3次元以外の10次元くらいが定義されていないので,またまた左側に描きます.するってえと,文字が重ね打ちされて,読めなくなります.どうするかって?どうしようもないでしょ!

お代わりII:いや別の場所に描きたいんだが

上のお代わりIで作成した図は,分かり良いとは言えないですよね.スペースが許すならば,別の場所に描きたいところです.これも簡単:

POSITION[1]="0.9 0 1"                                                             ← 0.6が現在の図の枠サイズで,新しい図のX位置,Y位置,図のサイズ,を指定                
OPT[1]="--pen-colors=4=DarkGreen --toggle-axis-end y" ← Y軸の位置を左に戻す               
X_AXIS[1]="""                                                                          ← X軸の文字列を指定しないと,2枚目以降は省略

これで作成すると

my4

Y方向にシフトする場合, X軸が共通なら省略しても良いですよね.これは --toggle-no-ticklabels x オプションであ〜る:

POSITION[1]="0 0.65 1"         
OPT[1]="--pen-colors=4=DarkGreen --toggle-axis-end y --toggle-no-ticklabels x"

これで出来たのが,下の図です:

 a

どこにでも描けるわけですので,もう一枚書いてみましょう.

m7

NEWPLOT=( 3 4 5 )          
・・・         
POSITION[2]="0.2 1.1 0.5"← 0番の図に対する相対位置で指定します.1番の図ではありませんので注意         
X_RANGE[2]="0.3 0.5 0.1"← 拡大して同じデータを描いてみる          
Y_RANGE[2]="0.6 0.75 0.05"← 拡大して同じデータを描いてみる          
OPT[2]="--pen-colors=4=DarkGreen --toggle-no-ticklabels x \          
      --toggle-axis-end y  --blankout 1.2"← デフォルトでは図の下地は透明である.           
# blankoutで数値を与えると, 図エリアx数値,のエリアが消される          
# ほんじゃ,描いてみようか          
draw my.pdf $TMP/fine.dat my.dat my2.dat my3.dat my3.dat

これで描いたのが,上の右の図です.一例として, この図を描くスクリプトを書いておきましょう:

#!/bin/bash         
. draw.sh         
X_AXIS='your X-axis'         
X_RANGE='0 1 0.25'         
Y_AXIS='\*c\mk\sb\fR1\eb\rt\sp2\ep'         
Y_RANGE='-1 1 0.5'         
LINE=( Solid:Red Omit:Black Solid:Blue Solid:Magenta )         
SYMBOL=( Omit FilledCircle:Red Omit )         
COLOR=1         
FONT_NAME=AvantGarde-Book         
FONT_SIZE=0.065         
# 1時間だけ存在する一時フォルダーを作ります         
TMP=`mktemp -dt my`         
# 元のデータが粗っぽいので,ごまかします         
spline my.dat >$TMP/fine.dat         
# ラベルを作成します         
cat > $TMP/legend.dat <<@         
#m=Solid:Black,S=Omit         
0.5 0.75         
0.6 0.75 l: theory         
#m=Omit,S=FilledCircle:Red         
0.55 0.6 l:\r2\r4 experiment         
@         
LEGEND=$TMP/legend.dat         
# 2枚目を重ね書きします         
NEWPLOT=( 3 4 5 )         
Y_RANGE[1]="-0.5 1.5 0.5"        
Y_AXIS[1]="ion current (\*mA)"        
POSITION[1]="0 0.65 1"        
OPT[1]="--pen-colors=4=DarkGreen --toggle-axis-end y --toggle-no-ticklabels x"        
# 1枚目のラベルを作成します        
cat > $TMP/legend2.dat <<@        
#m=Solid:Magenta,S=Omit        
0.1 -.3        
0.1 -.2        
0.1 -.25        
0.35 -.25 t:\fRlight on        
0.6 -.25        
0.6 -.3        
0.6 -.2        
0.1 0.1 lt:\fRion current        
@        
LEGEND[1]=$TMP/legend1.dat        
# 3枚目を重ね書きします        
POSITION[2]="0.2 1.1 0.5"        
X_RANGE[2]="0.3 0.5 0.1"        
Y_RANGE[2]="0.6 0.75 0.05"        
OPT[2]="--pen-colors=4=DarkGreen --toggle-no-ticklabels x --toggle-axis-end y\        
--blankout 1.2"        
# ほんじゃ,描いてみようか        
draw my.pdf $TMP/fine.dat my.dat my2.dat my3.dat my3.dat

線がたくさんありまして

線がたくさんあり, 線種やらマーカーやらの指定がもう少しなんとかならないというあなたは, 努力が不足しています.もちろん努力のベクトルが間違っている,ってことです. 

まずファイル名, 線種, マーカーが一行に書けたらいいな,という夢が大切です.存在しない夢は実現しないからです.まずそいつを実現しましょう:

n_l_s(){    
  cat<<@    
myfolder/myfile/data1.dat       Solid:Black:0.005        FilledNabla:Red:0.003    
myfolder/myfoil/data1.dat       Dash:Blue:0.005          WhiteCircle:Cyan:0.004    
...    
@    
}

これで,  n_l_s() を実行すると, 書き込んだ一覧が画面に表示されます. それでは仕方がないので,

FILES=( `n_l_s | gawk '{printf("%s ",$1);}'` )

これで配列FILESにファイルの一覧が設定されます.ということはLINE配列, SYMBOL配列は

LINE=( `n_l_s | gawk '{printf("%s ",$2);}'` )    
SYMBOL=( `n_l_s | gawk '{printf("%s ",$3);}'` )

すると, 描画は次の一手でOK:

draw chiken.pdf ${FILES[@]}

これで, 表みたいに「ファイル名」「線種別」「マーカ種別」を並べればよいので, わかりやすくなります.

お代わりIII: 等高線が描きたい

残念でした.PlotUtilsは, tをパラメータとするXY平面内の曲線 (x(t),y(t)) を描くもので, 等高線を描く機能はございません.

仕方がないので, MatLABとか, Octaveで, 上記曲線のデータを作成します(これらは同じスクリプトで大体動きます).曲線データを作成すれば, PlotUtilsで描くことができます.

では分からねえ,よな.

等高線を描くべき関数データファイルを作成

描くべきデータファイルをまだ持っていない場合, Octaveなどで作成できます.こげなスクリプトです:

#XYZデータを作成   
function [ x y z ] = save_xyz(filename,nx,ny,x,y);   
x = linspace(-1,1,nx);         # [-1,1]をnx等分割   
y = linspace(-1,1,ny);         # [-1,1]をny等分割   
fid=fopen(filename,'w');   
for i=1:nx   
for j=1:ny   
   z = exp(-2*x(i)*x(i))*exp(-3*y(i)*y(j)); # お試しZ値   
   fprintf(fid,"%f %f %f\n",x(i),y(j),z);   
end   
end   
fclose(fid);   
endfunction;   
# では実行してみる   
save_xyz("my_data.dat",101,101);

スクリプトを実行するには, 上の内容を, とあるフォルダー (仮に /Users/boke としよう)に noob.m というファイルに書き込み, Octave を起動して, cd /Users/boke, をやってから, noob と入力すれば良いです.

あんたのデータを読み込み

あんたのXYZデータをMATLAB行列に変換しましょう.

#XYZデータを行列に変換     
# X Y Z1 Z2 ... Zn たくさん値があってもOKよ     
# X Y Z1 Z2 ... Zn     
#     
...     
#     
function [ x y z ] = load_xyz(filename,nx,ny)     
loaded=load(filename);     
NF = size(loaded,2)-2;                                 #コラム数を取得     
printf("Number of functions: %d\n",NF);     
x=reshape(loaded(:,1),nx,ny);     
y=reshape(loaded(:,2),nx,ny);     
for i=1:NF     
  z{i} = reshape(loaded(:,i+2),nx,ny);     
end     
endfunction;     
# では実行してみる     
[x y z]=load_xyz("my_data.dat",101,101);     
# あー, MatLABでは[A B C]はベクトルを意味する.      
# ただしベクトルの要素は実数とは限らぬ. この例ではベクトルの各要素が行列だ

等高線データを作成

等高線を計算させる:

[cnt lev]=contourc(x,y,z{1},25);     
save mycontour.dat cnt;     
save mylevel.dat lev;

drawで描画

こいつをdrawで描画させる.例えば

draw mycontour.pdf mycontour.dat

で,これができるわけよ

mycont

等高線データを理解する

グラフを描くためにデータを理解する必要はないが, 暇なのであれば,等高線データを理解する関数を作成してもよい:

function [val lev] = savecontour(filename,cnt)     
# cntの構造     
# 1行目 L1 x1 x2 ... xN1 L2 x1 x2 ... xN2 ....     
# 2行目 N1 y1 y2 ... yN1 N2 y1 y2 ... yN2 ....     
# ^ptr     
# こいつを, (x1,y1)....(xN1,xN2) のセットごとに val に入れていく     
# [ A B ] これはベクトル     
# [ A11 A12 A13; A21 A22 A23 ] これは行列     
# { A, B, C } ベクトル のようであるが, A, B, Cが個別に数であろうが概念であろうが, なんでも良い.     
# { 1.2, [2 3], "Hoge?" } でもOK. Cell Array セル配列とよぶ.     
fid=fopen(filename,'w');     
npar = 0;     
ptr = 0;     
N = size(cnt,2);     
while(ptr < N)     
   npar++;     
   ptr++;     
   lev{npar} = cnt(1,ptr);     
   n = cnt(2,ptr);     
   val{npar} = cnt(:,((ptr+1):(ptr+n)))';     
   for i=1:n     
      fprintf(fid,"%f %f\n",cnt(1,ptr+i),cnt(2,ptr+i));     
   end     
   fprintf(fid,"\n");     
   ptr+=n;     
endwhile;     
fclose(fid);     
endfunction;     
#では実行してみる     
[cnt lev]=contourc(x,y,z{1},25);     
[val lev]=savecontour("mycontour.dat",cnt);

これで mycontour.dat ファイルができる.

内部関数一覧

draw.sh は単なるスクリプトですので,内部で定義されている関数を上書きできます.ただし,その機能が異なると,動作不良になります.以下の関数名は内部で利用されていますので,ユーザープログラムで使わないのが安全です.

  • add()                                         
    (x,y)列を受け取り,(x,x+y)列 に変更します.                                         
    使用例 cat my_file | add > your_file
  • av_SM() N [STEP]                                         
    (x,y)列を受け取り, N行データの移動平均値を出力します.N行受け取るまでは出力しません. N行以上のデータを読み込むたびに,直近N行の(x,y)平均を出力します. STEPが指定された場合, STEP行の入力に1回だけ出力します. STEPが省略されるとSTEP=1とみなされます.                                         
    使用例:av_SM 20 < my_file > your_file
  • average()                                         
    (x,y)列を受け取り, y列の平均値を計算します.                                         
    使用例: AV_Y=`average < my_file`   この例では, my_fileのy平均をAV_Y変数に代入しています.
  • draw()                                         
    描画します.
  • get_MV()                                         
    (x,y)列を受け取り, y値が変化した時だけ, (x,y)を出力します.
  • get_pair()
  • graph_gray()
  • least_2()                                         
    (x,y)列を受け取り, 最小二乗直線 y=a x + b の(a,b)を出力します. LS_RANGE=( xmin xmax )が指定されていると, xmin, xmaxにおける2点の(x,y)を出力します.
  • line_select()
  • make_legend()
  • randomize()  滑らかな曲線から,いかにも実際のデータのようなギザギザしたデータを作成します.
  • symbol_color()
  • symbol_select()
  • symbol_size()
  • swap()
File attachments
添付 サイズ
my3.dataのサンプル 1.95 KB
draw-1.08.zip 4.28 KB
draw-R1.09.zip 4.51 KB