二兎といわず・・・

いろんな事に手を出しすぎるTriが、SW・HWに関して、ふと興味を持ったことを適当に書き連ねるブログ

Python + Gnuplot (1) とりあえず使ってみる。

!!祝・ブログ開設!!

 

なんとなく初めて見ました。
というわけで、日々興味を持ったことを適当に書き連ねていきます。

 

まずは、Python+Gnuplot
仕事でDBに突っ込んだデータを適当に分析してグラフ化したくなったので、とりあえずやってみることに。
覚書として書いておきます。

 

私のMac環境で必要なものは下記。
Gnuplot
Gnuplot.py
・Numpy
・Scipy

 

まずは適当に表示してみます。

こんな感じです。

f:id:TriGT:20150325223055p:plain

 cos(x)の関数を表示してみました。
ソースはこんな感じ。
えらく簡単ですね。
Gnuplotをimportして、あとはオブジェクト生成、gnuplotのコマンドを叩いていけばイケます。

/bin/python
# coding: UTF-8

import Gnuplot
gplot = Gnuplot.Gnuplot()
gplot.title("cos")

gplot("plot cos(x)")

 

これだけじゃつまらないので、こんなものも。

f:id:TriGT:20150325232849g:plain

こんなソースです。

gnuplot初心者の私には、gnuplotの使い方がまず大事。
splotを使うと、x−y−zの3次元のグラフが描けるようです。
でもって、replotを使うと式を再評価して再度描画してくれます。
というわけで、グラフの式に時間の変数tを追加して、簡単にアニメーションにしてみました。

 

#! /usr/bin/python
# coding: UTF-8

import Gnuplot, time
gplot = Gnuplot.Gnuplot()
gplot.title("wave")

gplot("p1=60")
gplot("p2=70")
gplot("p3=1")
gplot("p4=1")

gplot("set pm3d")
gplot("set isosamples 40,40")
gplot("set xr[0:1.5]")
gplot("set yr[0:1.5]")
gplot("set zr[-1:1]")
gplot("t=0")
gplot("f(x,y,t)=sin(16*sqrt(x**2+y**2)+(t*0.2*pi))/(1+4*(x**2+y**2))")
gplot("set view p1,p2,p3,p4")
gplot("set terminal gif animate")
gplot("set output 'python+gnuplot_wave.gif'")
gplot("set tics font 'Times,18'")
gplot("splot f(x,y,t)")

i=0
while i<30:
        time.sleep(0.2)
        gplot("p2=p2+1")
        gplot("set view p1,p2,p3,p4")
        gplot("t=t+1")
        gplot("replot")
        i+=1

 

面に色をつけるのが

set pm3d

もっと綺麗な描画方法もあるようですが、とりあえずこれで十分です。

 

set isosamples 40,40 

 は、表示範囲の中でx,y軸それぞれを、いくつのポイントで値を評価するかですね。
この場合はx,y共に40箇所。計1600箇所です。

 

set xr[0:1.5]

set yr[0:1.5]

set zr[-1:1]

は、それぞれの軸の表示領域を設定します。

 

計算式はわかると思うので省略して、その次の

set view p1,p2,p3,p4

は、グラフを表示する位置・角度を設定しています。
これを変数化して、アニメーション中にグラフの周りを回るようにしています。

gplot("set terminal gif animate")
gplot("set output 'python+gnuplot_wave.gif'")
gplot("set tics font 'Times,18'")

ここはgifアニメーションとしてかき出すための設定です。
私はあまり使わなさそうなので、説明は省略。

あとは、時間tと表示角度p2をループの中で増やしていけばOK。

 

なんだか、ほとんどgnuplotの使い方になってますね・・・。
まぁ、Pythonからgnuplotを操作したということで良しとしましょう。

ただ、やりたいことは、DBのデータを元にgnuplotでグラフを表示すること。

次はsqlite3を繋いで、sqlite3内のデータをgnuplotに表示するようにします。