Tuesday 2 April 2013

gnuplot (2) -


つづき.


--1--
まずset terminal epslatex の出力がどのくらい綺麗かという話.
syntax は

       set terminal epslatex   {default}
       set terminal epslatex   {standalone | input}
                               {oldstyle | newstyle}
                               {level1 | leveldefault}
                               {color | colour | monochrome}
                               {solid | dashed}
                               {dashlength | dl <DL>}
                               {linewidth | lw <LW>}
                               {rounded | butt}
                               {clip | noclip}
                               {palfuncparam <samples>{,<maxdeviation>}}
                               {size <XX>{unit},<YY>{unit}}
                               {header <header> | noheader}
                               {blacktext | colortext | colourtext}
                               {{font} "fontname{,fontsize}" {<fontsize>}}

で色々オプションを付けられますがここでは一旦割愛.
foo.tex と foo.eps の2つのファイルができ,
output は拡張子 .tex  で設定すればいいようです(.eps でもわかってくれますが).
例えば

reset
set xrange[0:1200]
set xlabel "time"
set ylabel "percent"
set grid
set boxwidth 1 relative
set style fill pattern 2 border 
plot "type1.dat" u 1:($2*100/38) w boxes lc rgb "blueviolet" title "type 1"
set style fill pattern 1  border
replot "type2.dat" u 1:($2*100/66) w boxes lc rgb "green" title "type 2"
set style fill pattern 4  border
replot "type3.dat" u 1:($2*100/88) w boxes lc rgb "brown" title "type 3"
set terminal epslatex
set output "foo.tex"
replot 

というテキストファイルを作成(たとえば foo.plt にしましょう),
(gnuplot で使われる拡張子については揺れがあり,.plt は1つのよく用いられる選択肢のようです)
普通の teminal から
$ gnuplot foo.plt
と処理してやると foo.tex と foo.eps ができます.
普通に gnuplot 立ち上げて上のコマンド打ち込んでいってもいいです.
その後 bar.tex を作って
\documentclass{article}
\usepackage[dvipdfmx]{graphicx}
\begin{document}
This graph is great.

\begin{figure}[h]
    \centering
    \input{kasaneuch.tex}
    \caption{graph}
\end{figure}

AAAAND IT'S GONE
\end{document}


と記述して,後は latex + dvipdfmx で処理するとこんな感じ.

foo.tex の中身を書き換えれば日本語とかも通せるはず.
ついでにラベルに例えば % をそのまま入れちゃうとそれがそのまま .tex にも入って
結果コンパイルが通らなくなるのでお気をつけて.

なお最終的に文書中でサイズ変更をやる方法はまだ確立されていません.
まだといってもここ20分くらいの調査でということです.
がその前に書きたいところがあるので後まわし.
(ちなみに inkscape で svg や pdf や eps を latex+pdf/eps に変換することもでき,
これはこれでいい感じです.terminal からやるなら
$ inkscape -D -z --file=foo.svg --export-pdf=foo.pdf --export-latex
これの大きさ設定は出てきた .tex に書かれてるのに従えばいけます.)


--2-- fit

fit でフィッティングができます (you don't say?)
見た範囲では Ian's personal blog: Fun with gnuplot (blogspot) がさくっと使いやすい.
help fit の出力は結構長長しいので先ほどのリンクを参考にちょっと使ってみましょう.
まず函数形を指定,できれば適当な初期値を与えて,
fit {<ranges>} <expression>
           '<datafile>' {datafile-modifiers}
           via '<parameter file>' | <var1>{,<var2>,...}

でよい値を探してもらう(この時試行錯誤の結果がずらっと表示されます).
{datafile-modifiers}っていうのは多分何行目と何行目を使うでっていう指定とかそういうの.

例えばあるデータを下り坂の指数函数で近似するなら

gnuplot> f(x) = a * exp(-b*x)
gnuplot> fit f(x) "./data2.dat" via a,b

gnuplot> plot f(x), "./data2.dat" title "data2"

みたいにすれば
なんかそれっぽい.
初期値の設定は少しは真面目にやらないと行けなくて
(上では b の符号に - つけてるだけですが,多分何か値を入れてやったほうがいいです),
たとえば  f(x) = a * exp(b*x)でやると思い切ったことになります.

大惨事.
ちなみにこのデータについて,実際対数とって直線になるかを見てやるとこんな感じ.
後ろの方は無視して途中までのとこで一次函数で fit してもらいました.


命令はこんな感じ
reset
set origin 0,0
set xrange[0:300]
set yrange[0:5]
b=0.0
m=0.0
f(x) = m*x + b
fit[0:150] f(x) 'logo.dat' via b,m
set terminal png
set output "foooo.png"
plot "data2.dat" title "data2", f(x)


fit は色々奥深そうですが一旦はこんなもんで措きましょう.

という訳で長くなってきて記事消えるのが怖いのでこのへんで更新しましょうか.

4 comments:

  1. Replies
    1. ありがとうございます!うれしいです!
      僕としても色々身につけたいのでこんなことできるのか知りたいとかあればお知らせください.

      Delete
    2. これはお二方への発言ということで

      Delete