プロット (plot)

plot() は emout で最もよく使う機能です。データの次元に応じて自動的に適切な可視化を選択します。

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

主なオプション

パラメータ

説明

デフォルト

use_si

bool

SI 単位で軸ラベル・値を表示

True

show

bool

plt.show() を呼ぶ

False

savefilename

str

ファイルに保存

None

vmin

float

カラーバーの最小値

自動

vmax

float

カラーバーの最大値

自動

cmap

colormap

Matplotlib カラーマップ

独自 gray-jet

norm

str

'log' で対数カラースケール

None

mode

str

'cm'(カラーマップ), 'cont'(等高線), 'cm+cont'(両方)

'cm'

title

str

タイトルを指定

自動生成

xlabel

str

x 軸ラベルを指定

自動生成

ylabel

str

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

3D プロット(PyVista)

3D 可視化にはオプションの PyVista 依存をインストールします:

pip install "emout[pyvista]"
# 3D ボリュームレンダリング
data.phisp[-1, :, :, :].plot3d(mode="box", show=True)

# 2D スライスを 3D 空間に配置
data.phisp[-1, 100, :, :].plot3d(show=True)

# 3D ベクトル場
data.j1xyz[-1].plot3d(mode="stream", show=True)
data.j1xyz[-1].plot3d(mode="quiver", show=True)

メッシュサーフェス描画

面指向の 3D レンダリングで、明示的なメッシュサーフェスを使用します:

import matplotlib.pyplot as plt
from emout.plot.surface_cut import (
    BoxMeshSurface,
    CylinderMeshSurface,
    HollowCylinderMeshSurface,
    RenderItem,
    plot_surfaces,
)

fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")

plot_surfaces(
    ax,
    field=field3d,  # surface_cut.Field3D
    surfaces=[
        RenderItem(
            BoxMeshSurface(0, 10, 0, 6, 0, 4, faces=("zmax", "xmax")),
            style="field",
        ),
        RenderItem(
            CylinderMeshSurface(
                center=(5, 3, 2), axis="z", radius=1.5, length=4.0,
                parts=("side", "top"),
            ),
            style="solid",
            solid_color="0.7",
            alpha=0.5,
        ),
    ],
)