プロット (plot)¶
plot() は emout でいちばんよく使う機能です。スライス後の次元に応じて、自動で 1D ラインプロットと 2D カラーマップを切り替えます。
2D カラーマップ¶
3D ボリュームを 2D にスライスするとカラーマップが描画されます:
import emout
data = emout.Emout("output_dir")
# 最終ステップの xz 平面(y = ny//2)
data.phisp[-1, :, data.inp.ny // 2, :].plot()
# z=100 での xy 平面
data.phisp[-1, 100, :, :].plot()
1D ラインプロット¶
1D にスライスするとラインプロットが描画されます:
# x=32, y=32 での z 軸方向のプロファイル
data.phisp[-1, :, 32, 32].plot()
主なオプション¶
パラメータ |
型 |
説明 |
デフォルト |
|---|---|---|---|
|
|
SI 単位で軸ラベル・値を表示 |
|
|
|
|
|
|
|
ファイルに保存 |
|
|
|
カラーバーの最小値 |
自動 |
|
|
カラーバーの最大値 |
自動 |
|
colormap |
Matplotlib カラーマップ |
独自 gray-jet |
|
|
|
|
|
|
|
|
|
|
タイトルを指定 |
自動生成 |
|
|
x 軸ラベルを指定 |
自動生成 |
|
|
y 軸ラベルを指定 |
自動生成 |
使用例¶
ファイルに保存¶
data.phisp[-1, 100, :, :].plot(savefilename="phisp.png")
対数スケール¶
data.nd1p[-1, 100, :, :].plot(norm="log", vmin=1e-3, vmax=20)
等高線表示¶
data.phisp[-1, 100, :, :].plot(mode="cont")
カラーマップ + 等高線の重ね描き¶
data.phisp[-1, 100, :, :].plot(mode="cm+cont")
ベクトル場(ストリームライン)¶
2D ベクトルデータはストリームラインで描画されます:
data.j1xy[-1, 100, :, :].plot()
SI 単位と EMSES 単位¶
plot() は既定で軸ラベルと値を SI 単位に変換します。EMSES の内部単位のまま表示したい場合は:
data.phisp[-1, 100, :, :].plot(use_si=False)
SI 値の直接取得¶
.val_si プロパティで SI 単位の NumPy 配列を取得できます:
phisp_V = data.phisp[-1].val_si # 電位 [V]
j1z_A_m2 = data.j1z[-1].val_si # 電流密度 [A/m^2]
nd1p_m3 = data.nd1p[-1].val_si # 数密度 [/m^3]
データマスク¶
プロット前に特定の領域をマスクできます:
# 平均値以下をマスクしてプロット
data.phisp[1].masked(lambda phi: phi < phi.mean()).plot()
空間平均後の断面¶
時間範囲の空間平均を描画するときは keep_metadata=True を指定します。
縮約した軸を除き、残る軸の座標・単位と次元に合う Data クラスを保持します。
既定の False は従来の NumPy 縮約の挙動を維持するため、平均後の描画には使わないでください。
mean() の時間平均の既定動作は変わりません。
yz = data.phisp[:].mean(axis="x", keep_metadata=True)
yz[-1].plot() # Horizontal: y; vertical: z
profile = data.phisp[:].mean(axis=("x", "y"), keep_metadata=True)
profile[-1].plot() # z profile
空間平均は選択範囲をメモリに読み込みます。論文用の記録・再生でも同じ呼び出しを使えますが、 記録されるのは縮約前の選択範囲です。
3D 等値面(Matplotlib)¶
Data3d.plot(mode="cont") で切り出し・間引き後の等値面を元のグリッド座標に配置するには、
coordinates="grid" を指定します。各軸の開始座標と間隔を使い、use_si=True では
各軸を SI 単位に変換します。単位情報がない場合はグリッド単位を使います。
既定の coordinates="local" は、原点ゼロ・間隔1(SI 時は x 軸の単位長)の従来表示です。
roi = data.phisp[-1, 2:8:2, 3:9:2, 4:16:2]
roi.plot(mode="cont", coordinates="grid", use_si=False, levels=[8.0], show=False)
offsets=(x, y, z) は表示単位で座標に加算します。文字列の "left"、"center"、
"right" は、それぞれ選択範囲の最初・中央のサンプル・最後をゼロに移します。
bounds_xyz もオフセット適用後の表示座標で指定します。
3D プロット(PyVista)¶
PyVista backend を使うと、2D スライスを 3D 空間に配置したり、3D scalar / vector field を描画できます。このページでは入口だけ示します。mode、重ね描き、保存、HPC での使い方は PyVista 可視化 を参照してください。
# 3D scalar volume surface
data.phisp[-1, :, :, :].plot3d(mode="box", show=True)
# 2D slice placed in 3D space
data.phisp[-1, 100, :, :].plot3d(show=True)
# 3D vector field
data.j1xyz[-1].plot3d(mode="stream", show=True)
メッシュサーフェスの描画¶
境界を 3D field に重ねたい場合は、まず data.boundaries.plot3d() または plot3d(..., surfaces=data.boundaries) を使います。境界メッシュの合成、境界ごとの style、field-sampled な plot_surfaces() の詳細は 境界メッシュ を参照してください。
data.phisp[-1].plot3d(mode="contour", levels=[0.0], filename="phisp_iso.png")
data.j1xyz[-1].plot3d(surfaces=data.boundaries, filename="j1_stream.png")
VTK への出力¶
ParaView 等へ (z, y, x) の値を正しい x 最速順で出力するには ordering="vtk"、
切り出しの開始座標と stride を保持するには coordinates="grid" を指定します。
両オプションは PyVista 経路と PyVista 未導入時の XML 経路で同じ規約を使います。
roi = data.phisp[-1, 2:10:2, 3:12:3, 4:16:2]
roi.to_vtk("phisp_roi.vti", ordering="vtk", coordinates="grid", use_si=True)
use_si=True は単位情報があれば値と各軸の長さを SI へ変換します。
出力は従来どおり cell data です。保存座標をセルの下側の端点とし、セル中心はそこから
出力間隔の半分だけ正方向に置きます。stride 付きでは粗いセル幅も stride に比例し、
逆順スライスは座標と値を同時に反転して正の間隔で出力します。
EMSES のサンプルを point data に変更する API ではありません。
既定の ordering="legacy" と coordinates="local" は、z 最速・原点ゼロ・
stride を反映しない従来出力を維持します。定量的な空間比較には上記の両指定を使ってください。
穴表面ヘルパー¶
plot_surface_with_hole() と plot_surface_with_hole_half() の consistent=True は、
描画値と色範囲の単位を統一し、1つの 3D Axes に面を組み立てます。
use_si 省略時は単位情報があれば SI、なければ raw を使い、明示した ax3d を尊重します。
vmin=0 / vmax=0 もそのまま使います。
from emout.plot.extra_plot import plot_surface_with_hole
plot_surface_with_hole(data.phisp[-1], data.inp, consistent=True)
既定の consistent=False は従来の描画を維持します。従来呼出しでは use_si を明示して
色範囲との不一致を避け、全面ヘルパーには共有 ax3d も渡してください。