Wednesday 3 April 2013

gnuplot (3)


現実逃避が無限に捗る.


--1-- dumb のアピール
いまいち使い所のわからない気がする set term(inal) dumb さんですが.
仮想ターミナルで色々やってる時には必要ですね.CUI のままでグラフを見られる.
sin(x)/x
data plot
涙ぐましい.そしてこれをテキストとして保存することもできます(!).
 set term dumb
 plot sin(x)/x
と書いた foo.plt を用意して terminal から

$ gnuplot foo.plt > foo.txt
で実行するか,set output "foo.txt"を入れて plot すればいけます.多分後者ですべき.
(同日 20:08 追記: > foo.txt を書き忘れていた.)
で結果を張り付けると

    1 ++---------------+---------------****---------------+---------------++
      +                +              ** +**              +sin(x)/x ****** +
      |                              *      *                              |
  0.8 ++                             *      *                             ++
      |                             *        *                             |
  0.6 ++                           *          *                           ++
      |                            *          *                            |
      |                           *            *                           |
  0.4 ++                         *              *                         ++
      |                         *                *                         |
      |                         *                *                         |
  0.2 ++                        *                 *                       ++
      |    ******              *                  *              ******    |
      |  **      ***          *                    *          ***      **  |
    0 ***          **        **                    **        **          ***
      |              *      *                        *      *              |
 -0.2 ++              *** ***                        *** ***              ++
      |                  *                              *                  |
      +                +                 +                +                +
 -0.4 ++---------------+-----------------+----------------+---------------++
     -10              -5                 0                5                10
という感じ.なにかの時に使えそうですね.なにかの時に.ファイル添付できないとか.
ファイルのサイズも .png なら 4.9kB のところ 1.6kB と圧倒的なお得感.


--2-- 三次元 plot と plot "data.dat" matrix w image

さて.また別のかっこいいこともしたい.
3次元プロットも簡単で. splot でできます.かっこいい.
たとえば
splot sin(sqrt(x**2 + y**2)) / sqrt(x**2 + y**2)

視座はコマンドで指定しても良いし,マウスでぐるぐる回すこともできます(replot で受け継がれます).
視座設定についてはまた後で.
plot と同じようにコマンドを使えます.
(さっきの) with dots
メッシュの細かさを変えるには set isosample <number> で.
number に数の組を指定すると x 方向と y 方向を別に指定できるようです.
set isosample 100
replot

 おお,綺麗やん.

さてさて今回の本題はこれではなくて,ですね.
元々は w image の使い方についてから始まったこと.
普通のデータで plot hoge w image っていっても怒られたので.

まずメッシュな感じの(情報量としては3次元の)データファイルの読み込みについて.

3.24.62.57.3
1.8-2.90.13.3
0.9-3.50.05.7
3.25.86.89.3

イメージとしてはこういうデータ.n*m の行列にデータが入ってるという感じで,
たとえば標高のデータとかを想定してもらえればわかりやすいと思います.
三次元データの用意の仕方の1つは tab, 改行区切りの3行n列データ を用意する,
つまり (x,y,z) の値を与えるものですが,
ここでは (x,y) はデータの場所で,z をその値で表現します.
こういうのは matrix と指定してやれば読めるようです.

gnuplot> help matrix
 Datafile can be in an ascii or binary matrix format. The `matrix` flag
 indicates that the file is ascii, the `binary` or `matrix binary` stands for
 a binary format. For details, see `matrix ascii` and `matrix binary`.

 Basic usage in `splot`:
     splot 'a.dat' matrix
     splot 'a.gpbin' {matrix} binary
 Advanced usage in `splot`:
     splot 'a.dat' matrix using 1:2:3
     splot 'a.gpbin' {matrix} binary using 1:2:3
 allows to transform the axes coordinates and the z-data independently.

 Usage in `plot`:
     plot `a.dat` matrix
     plot `a.dat` matrix using 1:3
     plot 'a.gpbin' {matrix} binary using 1:3
 will plot rows of the matrix, while using 2:3 will plot matrix columns, and
 using 1:2 the point coordinates (rather useless). Applying the `every` option
 you can specify explicit rows and columns.

ほみほみ.とりあえず使ってみよう.
地形データとかあると嬉しいなーとおもってちょっと国土地理院とか見てみたのですが
なんとなくめんどくさいっぽいのでやめました. csvが良かったんやけどなー.
でもせっかくだから大きめのデータがほしいと思ったので,100*100 のデータを自作しました.
データはこちら, それを作る .py はこちら

   .py は 一応 defaultfuntion をいじればお好きな式で動くようになっていますが,
   全体に「とりあえず動くだけ」なのでまた綺麗にしていきたい.

電荷を 2つ(電気量は 1: -2)置いた時の,それらを含む平面における電位の分布.
適当に閾値をとってそれより伸びる値は切ってあります.
とりあえず覚えたばかりの matrix を使ってそのまま plot.

splot "./field.csv" matrix w line lw 0.1

lw(line width)で線を細くしてみました.
電位.
イイカンジプロジェクト(懐かしの simcity 4).

さて,with image でどうなるか.説明より見るのが早いでしょう.
ついでに http://www.gnuplotting.org/interpolation-of-heat-maps/ あたり参照.

#表示域を調節します.普通にやると箱の大きさ分-x,-yにはみ出るので半端なことになるので.
set xrange[0:100]
set yrange[0:100]
plot "field.csv" matrix w image

結果はこちら. イイネ!

これのデータの間を補完して滑らかさを上げて
こういう感じにもできるみたい(さっきのリンク参照)ですが,
これはまだどういうことやってるのかわかってないので詳細は後ほど.

plot と matrix だけでやると
plot "field.csv" matrix

w(ith) l(ine) を足せば
using を使うとまた別角度のが見られるわけですね.


ついでに,これも詳細はまた後ほど書きますが,3次元プロットには等高線を入れられるみたい.

 ふふふ

No comments:

Post a Comment