前回:https://qiita.com/Bluepost59/items/f2b0a1a8449440de6a1b
前回に引き続いて、今度はcontour図の書き方を概説しようと思う。
図:contour図の例
想定しているデータ形式
x,yの2次元系の温度分布のようなデータをカラーでプロットする場合を考える。たとえばfortranで出すとしたら、次のようなコードで出力されたものを考える。
do i = 1,Nx
do j = 1,Ny
write(UNITNUM,*) i,j,A(i,j)
end do
end do
この場合、出力されるデータの並びは次のようになる。
1 1 0.000
1 2 1.000
...
1 10 0.424
2 1 0.242
...
10 10 0.551
(10というのは適当に決めました)
データの整列
loadtxtで読むところまでは前回と同じだが、今回は3列であり、その上データの並びも折り返しを含むややこしい形になっている。
必要なデータ
contour図のプロットには、同じサイズを持つ3つの2次元NumPy配列が必要である。
- 各メッシュの横軸の値のリストx(同じ行では同じ値となる)
- 各メッシュの縦軸の値のリストy(同じ列では同じ値となる)
- 各メッシュのプロットしたい量の値のリストz
(参考サイト にわかりやすい図がある。)
このうち前の2つx,yは、1次元リストから生成するためのメソッドが用意されている。そのため基になる1次元リストを生成しなければならないが、方法としては
- サイズを用いてリスト内包表記などで抽出する
-
Numpy.linspace
を使う
などがある。
得られた1次元リストをpcolorメソッドで使えるような形にするには、numpyのmeshgridメソッドを使う。
x,y = np.meshgrid(x,y)
リストの整列
zはloadtxtした時点では1列に並べられているため、numpy.reshape
を用いて適切なサイズにしたのち、場合によっては転置する必要がある。
先の例ではzはyがny個書き出され、それをnx回折り返している。そのため列数がnyとなり、そのためサイズは(nx,ny)とする。
ただしプロットするデータは行がy、列がxに対応している。そのため行列を転置する必要がある。
pcolorとcontour
今回作るのはcontour図なので、直感的には「前回はpyplot.plotとしたところをpyplot.contourとするとよい」と思われる。ただし、contourは等高線をつないだ図になるので、カラーバーが不連続になってしまう。
そのため、gnuplotのpm3dに対応する連続的な温度図のようなものを出すにはpyplot.pcolorを使う。
サンプルスクリプト
import numpy as np
import matplotlib as mpl
mpl.use('Agg')
import matplotlib.pyplot as plt
nx = 100
ny = 200
mydata = np.loadtxt('mydata.txt')
xx = np.linspace(0,nx,nx)
yy = np.linspace(0,ny,ny)
xx,yy = np.meshgrid(xx,yy)
zz = mydata[:,2].reshape(nx,ny).T
myfig = plt.figure()
myax = myfig.add_subplot(1,1,1)
myim = myax.pcolor(xx,yy,zz)
myfig.colorbar(myim)
myfig.savefig('contour.png')
参考サイト
-
http://d.hatena.ne.jp/y_n_c/20091122/1258904025
メッシュの構造が分かりやすく解説されている。