2018.03.31 Sat |

Python, Matplotlibによるデータの可視化

機械学習に良く用いられることで有名なPython.その中のMatplotlibと呼ばれるモジュールには,結果をわかりやすく描画するために非常にたくさんのグラフツールが用意されています.

グラフの種類や色などが多岐にわたるため,機械学習に限らず様々なデータの可視化を行うことが可能です.CSVファイルの読み書きも簡便なため,
「Excelでデータを解析したはいいけど,描画に最適なグラフがない…」
なんて時にもおススメです!

今回はその中で等高線やヒートマップなどの3次元データのグラフ化を行ってみたいと思います.

動作環境はPython2.7,Windows8.1,Numpy1.9.2,Matplotlib1.3.1です.
データ処理のためにNumpyモジュールも用いています.
それぞれのインストール方法はわかりやすいサイトがたくさんありますので,そちらを参照ください.
インストールが無事に完了したら次へ進みます.

今回は以下のようなグラフの描画を目指します.

これはアンテナから電力を照射したときの,yz平面上の各点で観測される電力密度を図示したものです.
今回は,Excelで理想とするグラフが見つからなかったためにPythonを用いたという経緯になります.(Excelにも素晴らしいグラフはたくさんあります.)
このようなグラフを描画するにはmatplotlibのcontourfという関数(塗りつぶしの等高線)を用います.

このグラフを描画するために用いたコードが以下です.

まずnumpyのloadtxt関数でデータの入ったcsvファイルを読み込み,2次元配列として取り込みます.
delimeterは配列の要素同士を何で区切るかを指定します.csvファイルではカンマで値同士が区切られているため,カンマを指定します.

今回読み込んでいるデータは以下です.
1行目にy方向の軸を,1列目にz方向の軸を,2行2列目以降にその座標での電力密度の値を持っています.

 

またプログラムに戻ると,p2として軸(1行目と1列目)を取り除いたデータの2次元配列を作成しています.numpyのdelete関数で単純に1行目,1列目を順に取り除いているだけです.
もっと頭の良いやり方がある気がしますが,現状は思いついたこのやり方を用いています.

さらに,配列処理でy,zの軸をリストで取得しています.

また,その次の部分ではappend関数を用いてy,z軸それぞれの2次元リストを作成し,さらに2次元配列へ変換しています.
なぜこのようなことをしているのか?
実はここがcontourf関数を使う上でのポイントになっています.(普通の等高線,contourでも同様です.)

contourf関数では,2次元座標yzの各点での値p2を等高線として描画し,さらに塗りつぶしています.このyz各点での値を用いて処理する際,p2にyz各点の座標を与えてやる必要があります.
つまり,2次元配列のyとzとp2を重ねたときに,各位置でy,z,p2の値を一致させてやる必要があるということです.

少しややこしいので具体的に考えてみます.
y軸(y1,y2,y3),z軸(z1,z2,z3)で,その値に
(a,b,c
d,e,f
g,h,i)
を持つデータがあります.
私たちはこのようなデータを見たとき,無意識的に値fを持つ座標は(y3,z2)だと認識しています.
しかしコンピューターからすると,軸と値の型が異なるため,値fを持つのはどの座標なのか特定することができません.
そこで,
(y1,y2,y3
y1,y2,y3
y1,y2,y3)

(z1,z1,z1
z2,z2,z2
z3,z3,z3)
と軸と値の型を一致させてやることで,fの値を持つ座標は(y3,z2)であると認識させられるのです.

あとは
contourf(y軸,z軸,値,等高線の本数)
と記載することで先ほどのグラフが得られます.

ちなみに,
contourfではなくcontour(塗りつぶしなし等高線)を用いると,以下のような図になります.

 

また,このcontourをうまく使うと,以下のような流体シミュレーション(角柱周りの圧力分布)の描画もできるようになります.見た目が派手でいいですね.
この流体シミュレーションについては機会があったら別途記事にしたいと思っています.

 

K.M

東京大学大学院 工学系研究科 修士課程1年

2024.1  
給料も教育もガッツリと!メンター制度開始します  詳しく