5
2

More than 3 years have passed since last update.

VTKファイルを読み込んでjupyterでカラーマップ表示をする。

Last updated at Posted at 2020-03-09

はじめに

何をしたいか

2次元の温度シミュレーション結果のVTKファイルをjupyterで表示したい。

どうやって?

VTKファイルをPythonで読み込み、座標データと温度データを取り出して、Matplotlibで表示する。

環境

OS: Windows 10 home edition

Tool: Anaconda(Python 3.7.4)

シミュレーション結果のVTKファイル

有限要素法フリーソフトウェアであるFreefem++を利用して、熱拡散方程式を解き、その結果のVTKファイルを作成した。熱拡散方程式のコードはexampleのHeat.edpを利用した。Freefem++のインストールと実行方法は割愛する。利用したVTKファイルは、ここにおいておく。

Python VTKライブラリのインストール

conda を使ってインストールする。

conda install vtk

import 関係

操作に必要なNumpy、Matplotlib、VTKのライブラリをimportする。

import numpy as np
import maptlotlib.pyplot as plt
import vtk
from vtk.util import numpy_support
%matplotlib inline

VTKファイルの読み込み

VTKファイルが非構造格子だったため、Unstructuredで読み込む。

#ファイル読み込み
filename = "heat_result.vtk"
reader = vtk.vtkUnstructuredGridReader()
reader.SetFileName(filename)
reader.Update()

温度のCell DataのPoint Dataへの変換

今回のVTKファイルの座標データがPoint Dataで、温度データがCell Dataとなっている。座標データと温度データを一対一の関係にしたいので、全部Point Dataに変換する。

#cell data から point data変換
cell2point = vtk.vtkCellDataToPointData()
cell2point.SetInputData(reader.GetOutput())
cell2point.Update()

変換したデータからの座標と温度データの抜き出し

VTKファイルを読み込み、vtk_supportを利用して、VTKデータから座標データと温度データを取り出す。

#座標と温度データのnumpy化
coord = numpy_support.vtk_to_numpy(cell2point.GetOutput().GetPoints().GetData())
x = coord[:,0]
y = coord[:,1]
z = coord[:,2]#使わない。2次元の熱拡散方程式の結果なのですべて0である。
#GetAbstractArray(0)にはLabel、GetAbstractArray(1)に温度データが入っている。
temperature = numpy_support.vtk_to_numpy(cell2point.GetOutput().GetPointData().GetAbstractArray(1))

Matplotlibでのカラーマップ表示

準備が整ったので、あとはMatplotlibで表示するだけである。非構造データのため、tricontourfを利用してカラーマップを表示する。

##カラーマップ出力
plt.tricontourf(x,y,temperature,levels=15,cmap="jet")
plt.colorbar()

coloarmap.png

全コード

import numpy as np
import matplotlib.pyplot as plt
import vtk
from vtk.util import numpy_support
%matplotlib inline
#ファイル読み込み
filename = "heat_result.vtk"
reader = vtk.vtkUnstructuredGridReader()
reader.SetFileName(filename)
reader.Update()

#cell data から point data変換
cell2point = vtk.vtkCellDataToPointData()
cell2point.SetInputData(reader.GetOutput())
cell2point.Update()

#座標と温度データのNumpy化
coord = numpy_support.vtk_to_numpy(cell2point.GetOutput().GetPoints().GetData())
x = coord[:,0]
y = coord[:,1]
z = coord[:,2]#使わない。2次元の熱拡散方程式の結果なのですべて0である。
#GetAbstractArray(0)にはLabel、GetAbstractArray(1)に温度データが入っている。
temperature = numpy_support.vtk_to_numpy(cell2point.GetOutput().GetPointData().GetAbstractArray(1))

#カラーマップ出力
plt.tricontourf(x,y,temperature,levels=15,cmap="jet")
plt.colorbar()

参考

VTKクラスは、c++のclassリファレンスが公開されている。Python VTKの構造と名前はc++リファレンスと同じなので、参考にはできる。主に参考にしたの下記のサイトである。

5
2
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
2