データをグラフ表示する
まえがき
最近ブログを書いてないなと思い、確認すると8か月くらい空いていて戦慄したウグイスです。
今回はリハビリということで、軽めの内容です。
ちょっとデータをグラフ表示する機会がありまして、その時にgnuplotとpyplotを使ったのでそれの紹介をします。
インストール
WSLで作っていたもので必要だったので、そこへの導入方法です。
WSLだとGUI表示をするのにXサーバーというのが必要らしく、追加でwindows側にソフトを入れないといけなかったりします。ただ、そこまで書くのが面倒なのでここでは省略。
gnuplot
sudo apt install gnuplot
もちろんsudo apt upgrade
とかは忘れちゃだめです(私はこれを忘れて無駄に時間を使いました)
pyplot
python入れてpip install matplotlib
とかで行けるはず。(python3だとpip3になったりします)
まあ雑な説明ですが、大体これであってるはず。
おためし
こういうグラフ描画系の紹介だとよく三角関数を描画しているのでそれに倣ってみます。
gnuplot
gnuplotと打てばgnuplotが下図のように起動します。
この状態でplot sin(x)と入力します。
無事sin関数が表示されました。
pyplot
pyplotはpythonのライブラリなので当然コードを書く必要があります。以下がsin関数を表示するためのコードです。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10,10,200)
y = np.sin(x)
plt.plot(x,y)
plt.show()
これを実行すると
こんな感じで表示されます。
ちなみに、np.linespace(-10,10,200)は-10から10までを200に分けた配列を作るみたいな感じです。
データを表示させる
ここまでは前座で、ここからが本番です。
データは適当でいいので、今回はプログラムで乱数使って適当に生成したものを使います。
データはx y1 y2 y3みたいな感じでデータ数は30。半角スペース区切りのテキストファイル。ファイル名はoutput.txtとします。
gnuplot
まずはxとy1を表示してみます。gnuplotを起動し以下のコマンドを実行
plot "output.txt" ti "y1"
このように、点描でグラフが描画されます。ただ少し見づらいので折れ線グラフにします。以下のコマンドを実行
plot "output.txt" ti "y1" with lines
コマンドについて少し説明
plot "output.txt"
でoutput.txtの1列目と2列目を読み込んで表示してくれます。
ti "y1"
でそれに名前を付けています。右上の方に表示されてますね。
with lines
で各点をつないで表示してくれます。
複数のデータを同時に表示します。以下のコマンドを実行
plot "output.txt" ti "y1" with lines,"" using 1:3 ti "y2" with lines,"" using 1:4 ti "y3" with lines
コマンドについて少し説明
複数のデータを同時にグラフにしたい場合は,(カンマ)区切りでそれぞれ入力します。
二つ目以降""
の中身がないですが、同じファイルから読み込む場合は省略できるようになっています。
using x:y
はx列目とy列目を読み込むと指定します。
pyplot
gnuplotでは段階に分けて説明しましたが、pyplotは何回も似たコードを張りたくないので、まとめて一つのコードと実行結果を出して。説明する形式にします。
import numpy as np
import matplotlib.pyplot as plt
data = np.genfromtxt("output.txt")
plt.plot(data[:,0],data[:,1],label="y1")
plt.plot(data[:,0],data[:,2],label="y2")
plt.plot(data[:,0],data[:,3],label="y3")
plt.legend()
plt.show()
まあこのように、グラフが出力されます。
説明していきます
genfromtxt()
はテキストファイルの名前を渡すとその中身を2次元配列として読み込みます。
plot()
はグラフを描画します。
引数のdata[:,0]
とかについて。:はスライスというもので説明は省きますが、これで0列目にアクセスできます。
label=
で名前を付ける感じです。凡例の表示で使います。
legend()
は左上にある、凡例を表示させる関数です。
軸にいろいろする
ここまでで最低限グラフ表示はできてますが、ここでは軸に名前を付けたり、スケールを変更する方法を紹介します。
gnuplot
gnuplotではplot
で描画する前に、コマンドを打つことでグラフの設定が行えます。コマンドを3つ紹介します。
set xlabel "Name"
x軸に名前を付けられる。この場合だとNameになる。
set ylabel "Name"
y軸に名前を付けられる。この場合だとNameになる。
set logscale (x or y)
グラフの軸を対数目盛にすることができます。logscaleの後ろにxと書くとx軸だけが、yと書くとy軸だけ、何も書かなければ両方の軸が対数目盛になります。
実際にやってみます。データはWSLで作っているものから持ってきました。きれいに比例しているデータなので、見た目は面白くないですがご寛恕を
以下のコマンドを順に実行
set xlabel "x"
set ylabel "y"
set logscale
この状態でplotを行うと以下のようにグラフが表示されます。
見てわかる通り、両軸ともに10の何乗みたいな感じになっています。データ数が指数的に増えるデータの描画をしたいときに使えますね。
pyplot
pyplotでも同じことをしてみます。以下がコードです。
import numpy as np
import matplotlib.pyplot as plt
data = np.genfromtxt("output.txt")
plt.xlabel("x")
plt.ylabel("y")
plt.xscale("log")
plt.yscale("log")
plt.plot(data[:,0],data[:,1],label="y1")
plt.plot(data[:,0],data[:,2],label="y2")
plt.plot(data[:,0],data[:,3],label="y3")
plt.legend()
plt.show()
先ほどのプログラムに6行目から10行目までの内容を追加しました。
少し説明をします。
xlabel("x")
でx軸に名前を付けてます。この場合はx
ylabel("y")
でy軸に名前を付けてます。この場合はy
xscale("log")
でx軸を対数目盛にしています。ちなみにlogの部分をいろいろ変えれるみたいです。私は必要ないので調べてないですが。
yscale("log")
でy軸を対数目盛にしています。同上
gnuplotでちょっと楽になる方法
gnuplotってグラフを表示させるのにいちいちコマンドを入力しないといけないのが面倒だったりします。(特にplotは長くなりがち)
そういう時にはバッチファイルを作れば解決します。
ディレクトリに「plot_data.gp」というファイルを作ります。それを以下のように編集します。
set xlabel "x"
set ylabel "y"
set logscale
plot "output.txt" ti "y1" with lines,"" using 1:3 ti "y2" with lines,"" using 1:4 ti "y3" with lines
pause -1 "Press Enter key to quit"
その後、ターミナルにgnuplot plot_data.gp
とすれば、グラフが表示されます。
一番最後の行はEnterを押すまで止まるってことで、これがないとグラフが一瞬表示されてすぐ消えるので注意。
要するに実行する命令を順番に記述したテキストファイルです。これがあると、確認の時とかに長ったらしいコマンドを書かなくて済むのでオススメです。
あとがき
そんなに難しい内容でもないのに長いブログになってしまいました。もう少し短くできるよう努力します。
pyplotは(他の人のブログでも使われているので)書かなくてもいいかなとも思ったのですが、gnuplotの使い方と併記しておけば見返すときに便利なのでこの形にしました。見づらかったら申し訳ない。
gnuplotとpyplot両方使った感想ですが、まあpyplotの方が取り回し楽ですね。結局作っていたものでもpyplotが採用されました。
次のブログは多分Unityゲーム紹介になると思います。次は8か月も空けないようにします。
pyplotしか使ったことないので助かります