Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

サンプルスクリプト

https://gist.github.com/Bluepost59/1f844f0aa9914b2b622c192e5c969edc

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')

参考サイト

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした