計算結果を3次元可視化ソフトで解析する前に、とりあえず簡単に結果を目で見れるようにしたい、ということでmatplotlibのpcolormeshとquiverを使って2次元平面でのスカラー場とベクトル場の可視化を行うスクリプトを作りました。
ただそんときに、
pcolormeshとquiverでは指定するグリッドの座標の位置が異なる、ということがあったので注意が必要なようです。
具体的には、
■pcolormesh→カラープロットしたいスカラー量の2次元データのグリッド数(NX, NY)よりも1大きいグリッド(NX+1, NY+1)を用意、そのグリッドの間に色塗りしてくれる
■quiver→2次元ベクトル表示したいデータと同じグリッドでおk、そのグリッド位置にベクトルを表示してくれる
というようになっていました。
まあこれに限った話ではなく、特にカラープロットするときなんかはグリッド交差点なのか、グリッド中心なのかモノによって違うんでちゃんとマニュアル見なさい、ということですね。
以下にサンプルを置いておきます。
### sample.py ###
import numpy as np
import matplotlib.pyplot as plt
### 例えばNX=8, NY=8の一様グリッドで計算した結果を出力したいとする
NX=8
NY=8
xvmin=0.
xvmax=1.
yvmin=0.
yvmax=1.
xcmin = xvmin - (xvmax - xvmin)/(2.*NX)
xcmax = xvmax + (xvmax - xvmin)/(2.*NX)
ycmin = yvmin - (yvmax - yvmin)/(2.*NY)
ycmax = yvmax + (yvmax - yvmin)/(2.*NY)
### カラープロットのグリッド
xc =np.linspace(xcmin-,xcmax,NX+1)
yc = np.linspace(ycmin,ycmax,NY+1)
XC, YC = np.meshgrid(xc,yc)
### ベクトルのグリッド
xv = np.linspace(xvmin,xvmax,NX)
yv = np.linspace(yvmin,yvmax,NY)
XV,YV = np.meshgrid(xv,yv)
### 本当はバイナリファイルから計算データを読むけど
### 面倒なのでここは省略、代わりに適当なのを用意
rho = np.exp(-(XV**2+YV**2))
vx = np.random.rand(NX*NY).reshape(NX,NY)
vy = np.random.rand(NX*NY).reshape(NX,NY)
### 描画と出力
plt.pcolormesh(XC,YC,rho)
plt.colorbar()
plt.quiver(XV,YV,vx,vy)
plt.xlim([xcmin,xcmax])
plt.ylim([ycmin,ycmax])
plt.show()