読者です 読者をやめる 読者になる 読者になる

ヒッキー ときどき 旅人ランナー

普段は家にひきこもってます

gnuplotでランダムウォークをリアルタイム描画してみたい

そもそもgnuplotってなに?っという方々のために

d.hatena.ne.jp

これを使ってリアルタイムでグラフ描画をしてみたいと思います。

(リアルタイムって言葉結構好きなもんで)

ということで、まずgnuplotをpcにインストールします。

自分はUbuntuベースのElementary OSを使っているので

以下のコマンドで必要なツールをインストールしました。

sudo apt-get install gnuplot gnuplot-x11

これでgnuplotコマンドが使えるようになります。

gnuplot-x11パッケージもインストールしておかないとグラフ描画できないみたいです。

ということで準備が整いました

↓説明だったりサンプルプログラムはgnuplotのhpを参照ください

gnuplot homepage

↓日本語のインストラクションもあります

gnuplot tips (not so Frequently Asked Questions)

Gnuplot pm3d

参考リンクよりgnuplotの使い方は理解できましたでしょうか?




自分の場合はshellスクリプトランダムウォーク数値計算gnuplotの呼び出しを行いました。

以下にランダムウォークソースコードを張り付けておきます。

random_walk.sh
#!/bin/bash

#if file exsists, clear the file 
if [ -e "random_work.dat" ]
then
    cat /dev/null > random_work.dat
fi

i=0
x=0
y=0
echo "$i $x $y" >> "random_work.dat"

#start the process of gnuplot 
gnuplot -persist -e "config='config.plt'; plot 'random_work.dat' using 2:3 \
    ti 'random_walk' with points ps 1 pt 1" loop.plt &
gnu_pid=`echo $!`

#calculation of random walk
for ((i=1;i<1000000;i++))
do
    det_x=`echo $(((1+RANDOM%10)%2))`
    det_y=`echo $(((1+RANDOM%10)%2))`

    if [ $det_x -eq 0 ]
    then
        x=`echo $((x+1))`
    else
        x=`echo $((x-1))`
    fi

    if [ $det_y -eq 0 ]
    then
        y=`echo $((y+1))`
    else
        y=`echo $((y-1))`
    fi

    #input x and y value into the file 
    #echo "$i $x $y" 
    echo "$i $x $y" >> "random_work.dat"
done

#push enter to finish gnuplot 
echo -e "/n/nFinished plotting the data....press Enter key"
read
kill $gnu_pid
loop.plt
#!/usr/bin/gnuplot

#load config file
load config 
pause 0.1
replot
reread
config.plt
#!/usr/bin/gnuplot

#setting the graph
set xrange [-500:500]
set yrange [-500:500]
set xlabel "x"
set ylabel "y"

以下にソースコードの説明を記述しておきます。

  1. gnuplot -persist -e "config='config.plt'; plot 'random_work.dat' using 2:3 \ ti 'random_walk' with points ps 1 pt 1" loop.plt &

`gnuplot -e "command1; command2; ...."

なので、変数configの定義とplotコマンドを実行します。

それらに加えてloop.pltが別プロセスでよばれます。

  1. reread

によってloop.pltが再度呼ばれます

つまり、loop.pltは0.1秒間隔で実行されます

  1. config.pltとloop.pltはぶっちゃけ分ける必要はないですが、

 役割を分けた方が分かりやすいとおもったので、とりあえず。


random_walk.shを実行した時の動画リンクを以下に貼っておきます。

www.youtube.com


ということで以上となります。何かに使えましたらご利用ください。