LoginSignup
5
7

More than 5 years have passed since last update.

資料作りのためのmatplotlib入門(2) 2次元contour図

Last updated at Posted at 2018-03-09

前回:https://qiita.com/Bluepost59/items/f2b0a1a8449440de6a1b

前回に引き続いて、今度はcontour図の書き方を概説しようと思う。

contour.png

図: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を使う。

サンプルスクリプト

contour.py
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')

参考サイト

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7