小林 未知数の備忘録
gnuplot

gnuplot全般

  • gnuplotのインストール

                    apt-get install gnuplot
                    apt-get install gnuplot-x11
  • 軸ラベルのオフセット指定

                    set xlabel "x" offset *,*
                    set ylabel "y" offset *,*
  • 対数スケールの設定と軸ラベルの書式設定

                    set logscale x
                    set format x "$10^{%L}$"
  • 軸ラベルの冪乗表示設定

                    set format x "$%.0t \\times 10^{%T}$"
  • gnuplotのepslatexでの出力

                    set terminal epslatex color 12(文字サイズ)
                    set output "graph.eps"
    グラフを描画した後、すぐに別名でoutputを指定しないとepsの凡例表示がおかしくなったり、そもそもコンパイルエラーが出る。
  • gnuplotのepslatexで綺麗なepsファイルを作る

    LaTeXの文章に貼り付けるだけならいいが、文字入りのファイルを作るのであれば
                    \documentclass[12pt]{article}
                    \usepackage[dvips]{graphicx}
                    \pagestyle{empty}
                      
                    \begin{document}
                    \input{graph.tex}
                    \end{document}
    で画像を貼り込んだLaTeXファイルをコンパイルし、できたdviファイルを
                    dvips -E -o figure.eps figure.dvi
    このままだと余白がやや大きいのでepstoolを用いて余白を最小化する(standaloneクラスはあまり役に立たない)。
                    epstool --copy --bbox figure.eps dammy
                    mv dammy figure.eps
    ubuntu用にスクリプト化するならこんな感じ
                    #!/bin/sh
                    gnuplot $1.gp
                    echo '\\documentclass[12pt]{article}' > figure.tex
                    echo '\\usepackage[dvips]{graphicx}' >> figure.tex
                    echo '\\usepackage{amsmath,amssymb}' >> figure.tex
                    echo '\\pagestyle{empty}' >> figure.tex
                    echo '\\begin{document}' >> figure.tex
                    echo '\\input{graph.tex}' >> figure.tex
                    echo '\\end{document}' >> figure.tex
                    latex figure.tex
                    dvips -E -o figure.eps figure.dvi
                    epstool --copy --bbox figure.eps dammy
                    mv dammy $1.eps
                    rm graph.tex
                    rm graph.eps
                    rm figure*
    ただしgpファイルの先頭に
                    set terminal epslatex color 12
                    set output "graph.tex"
    を入れておく必要がある。 ただしepstoolはバグでものすごくおかしなBoundingBoxを叩き出すことがある(set size squareとunset yticsを組み合わせたときに起こったことを確認)。この場合はepstoolを使う代わりに
                    eps2eps figure.eps dammy
    としてdammyの中のBoundingBoxを元々のfigure.epsに設定すれば良い。スクリプトにするなら
                    #!/bin/sh
                    gnuplot $1.gp
                    echo '\\documentclass[12pt]{article}' > figure.tex
                    echo '\\usepackage[dvips]{graphicx}' >> figure.tex
                    echo '\\usepackage{amsmath,amssymb}' >> figure.tex
                    echo '\\pagestyle{empty}' >> figure.tex
                    echo '\\begin{document}' >> figure.tex
                    echo '\\input{graph.tex}' >> figure.tex
                    echo '\\end{document}' >> figure.tex
                    latex figure.tex
                    dvips -E -o figure.eps figure.dvi
                    eps2eps figure.eps dammy
                    DAM=`sed -n '2,2p' dammy`
                    sed -i "5c$DAM" figure.eps
                    mv figure.eps $1.eps
                    rm dammy
                    rm graph.tex
                    rm graph.eps
                    rm figure*
  • gnuplotでグラフをアスキーアートで表示する

                    set terminal dumb
  • gnuplotのeveryの使い方

                    every 行刻み:ブロック刻み:初期行:初期ブロック:終了行:終了ブロック
  • 範囲を指定してプロットする

                    plot [a:b] f(x)
    はset xrangeと矛盾すると挙動が変になるのであまり使い物にならない。ここは3項演算子とやらを使って
                    plot ((x-a)*(x-b) < 0 ? f(x) : 1/0)
  • Mathematicaっぽい外見の関数プロット

    ここを参照
  • リストデータのみからヒストグラムを作る

    gnuplotではKaleida graphなどの有料グラフ作成ソフトと違ってリストデータからヒストグラムは作られないと思っていたがそんなことはなかった。

    ここを参照
  • 複数ファイルを1つに結合してプロットする

                    plot "< paste file1.dat file2.dat" using 1:($2/$4)
  • 線分を引く

                    set arrow from *,* to *,* nohead lc * lw *
  • 点を打つ

                    set label 1 point ps * pt * lc * at *,*
    splotで線、点を描画する場合はfrontも付ける。
  • 組み込み関数atan2(y,x)=atan(y/x)

    atan2(x,y)ではないので注意 (fortranと同じでMathematicaと逆)