Yamamoto's Laboratory
基本事項
陰関数

Matplotlib陰関数 (implicit funtion)

Matplotlib のモジュール Pyplot を使い陰関数プロットの作成方法を示します.

目次


基本事項

概要

陰関数のプロットの作成は,結構面倒です.プロットを作成するために必要な「\(f(x,y)=0\) を満たす \((x,y)\) の集合」を得ることは,簡単ではありません,非線形の方程式を解く必要が生じるからです.ただし,媒介変数に変換できる特別な場合は,別です.

とりあえずプロット

陰関数をプロットするプログラムを示します.陰関数として, \begin{align*} x^2-2xy+2y^2=1 \end{align*} を例にします.これは楕円で,これをプロットするプログラムは以下のとおりです.

陰関数 (楕円) プロットの例(ellipse.py)

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
axis = fig.add_subplot(1,1,1)

x, y = np.mgrid[-2: 2: 4001j, -2: 2: 4001j]

axis.set_title('Ellipse')
axis.set_xlabel(r'$x$', fontsize=20, fontname='serif')
axis.set_ylabel(r'$y$', fontsize=20, fontname='serif')
axis.tick_params(axis='both', length=10, which='major')
axis.tick_params(axis='both', length=5,  which='minor')
axis.minorticks_on()
axis.set_aspect('equal', 'box')
axis.set(xlim=(-2, 2), ylim=(-2, 2))

axis.contour(x, y, x**2 - 2*x*y + 2*y**2, [1])

plt.show()
fig.savefig('plot.svg', transparent=False)

このプログラムの各行の動作は,以下の通りです.

動作
1 – 2 Python のモジュール numpy と matplotlib.pyplot を読み込みます.
4 図を作成します.
5 図の軸を作成します.
7 プロットに必要なグリッドの座標を作成します.x 軸と y 軸の範囲 \([-2,\,2]\)を4001個のメッシュのノード (メッシュの交点) を作成します.この場合のノードの間隔は 0.001 になります.
9 プロットのタイトルの設定です.
10 – 11 x/y 軸のラベルの設定です.
12 – 13 x/y 軸の目盛りの設定です.
14 マイナー目盛り (小目盛り) をの描画を ON にします.
15 x/y 軸を同じ長さにします.
16 x/y 軸の範囲を指定します.
18 等高線プロット \(x^2-2xy+2y^2=1\) を作成します.
20 プロットを表示します.
21 作成したプロットをファイル「plot.svg」に保存します.

このプログラムを実行すると,以下の楕円のプロットが得られます.

図1: 楕円のプロット

陰関数プロットの例

プロットの装飾

等高線プロットを作成する「matplotlib.pyplot.contour」の引数は,以下のとおりです.

matplotlib.pyplot.contour([X, Y,] Z, [levels], **kwargs)

引数の内容は,以下のとおりです.

引数 設定内容
X, Y オプション: 座標を表す配列 (array-like).Z の値の座標 (x, y)で,z と同じサイズの二次元配列にします(たとえば,numpy.meshgrid で作成する.).または両方とも一次元にすることもできます.その場合 Z の列の座標を x に,行の座標 y に入れます.これらのオプションを指定しない場合は,配列の番号 (整数) が座標になります.
Z z の値を表す配列 (array-like).
levels オプション: 整数あるいは配列 (array-like).整数:n の場合,n+1 本の等高線を描きます. 配列の場合,指定された値の等高線をぷおっとします.値は昇順でなければなりません.
corner_mask オプション: ブール.コーナーマスキングを有効/無効にします.Zがマスクされた配列の場合にのみ効果があります.False の場合.マスクポイントに接触している四角形はマスクされます.True の場合,それらのポイントに最も近い四角形の三角形のコーナーのみが常にマスクされ,3つのマスクされていないポイントを含む他の三角形のコーナーは通常どおりに輪郭が描かれます.デフォルトは rcParams ["contour.corner_mask"]=True で,デフォルトは True です.
colors オプション: 色あるいは色のシーケンス.レベル (等高線) の色をしていします.シーケンスは,レベルの昇順で循環します. シーケンスがレベル数よりも短い場合は,繰り返されます.ショートカットとして,単一要素のリストの代わりに単色の文字列を使用できます.つまり,['red'] の代わりに 'red'を使用して,すべてのレベルを同じ色で着色できます. このショートカットは色文字列に対してのみ機能し,色を指定する他の方法には機能しません.デフォルト(値 None) では,cmap で指定されたカラーマップが使用されます.
alpha オプション: 実数.アルファーの値の指定で,0.0(透明)— 1.0(不透明)です.
cmap オプション: 色あるいはカラーマップ.カラーマップは,レベル値を色にマップします. デフォルトはrcParams ["image.cmap"] = 'viridis'です.指定した場合,色はcmapよりも優先されます.
norm オプション: 色のノルム.カラーマップが使用されている場合,Normalize インスタンスはレベル値を標準的なカラーマップ範囲[0,1] にスケーリングして,色にマッピングします. 指定しない場合,デフォルトの線形スケーリングが使用されます.
vmin, vmax オプション: 実数.None でない場合,これらの値のいずれかまたは両方が Normalize インスタンスに提供され,レベルに基づいたデフォルトのカラースケーリングをオーバーライドします.
origin オプション: {None, 'upper', 'lower', 'image'}.Z[0,0] の位置を指定して,Zの方向と正確な位置を決定します. これは,X,Yが指定されていない場合にのみ関係します.
origin 内容
なし Z[0,0] は,左下隅の X=0, Y=0 にあります.
lower Z[0,0] は,左下隅の X =0.5, Y=0.5 にあります.
upper Z[0,0] は左上隅の X=N+0.5, Y=0.5 にあります.
image rcParams["image.origin"] = 'upper' の値を使用します.
extent オプション: (x0, x1, y0, y1).origin が None でない場合,エクステントは imshow のように解釈されます:外側のピクセル境界を提供します. この場合,Z[0,0] の位置はピクセルの中心であり,角ではありません. origin が None の場合,(x0,y0) は Z[0,0] の位置であり,(x1,y1) は Z[-1,-1] の位置です.contour の呼び出しで X と Y が指定されている場合,この引数は無視されます.
locator オプション: 目盛りのロケーター.レベルを介して明示的に指定されていない場合,ロケーターを使用して輪郭レベルを決定します. デフォルトは MaxNLocator です.
extend オプション: {'neither', 'both', 'min', 'max'}.デフォルトは,「neither」.レベル範囲外の値の輪郭色を決定します.「neither」場合,レベル範囲外の値は色付けされません. 「最小」,「最大」または「両方」の場合,レベル範囲の下,上,または下,上に値を色付けします.min(levels) 未満および max(levels) を超える値は,カラーマップのアンダー/オーバー値にマップされます. ほとんどのカラーマップにはデフォルトでこれらの専用の色がないため,オーバー値とアンダー値はカラーマップのエッジ値であることに注意してください. Colormap.set_underとColormap.set_over を使用してこれらの値を明示的に設定することができます.
xunits, yunits オプション: registered units.matplotlib.units.ConversionInterface のインスタンスを指定して,軸単位をオーバーライドします.
antialiased オプション: ブール.アンチエイリアスを有効にして,デフォルトを上書きします. 輪郭が塗りつぶされている場合,デフォルトは True です. 線の輪郭の場合,rcParams["lines.antialiased"]=True から取得されます.
Nchunk オプション: ゼロ以上の整数.0の場合,ドメインの下位区分はありません. 正の整数を指定して,ドメインを unkunk のサブドメインに分割します. チャンク化により,輪郭アルゴリズムによって生成されるポリゴンの最大長が短縮され,バックエンドに渡されるレンダリングワークロードが削減され,RAM がわずかに少なくなります. ただし,バックエンド,アンチエイリアスフラグ,およびアルファの値に応じて,チャンク境界にレンダリングアーティファクトが発生する可能性があります.
linewidths オプション: 実数あるいは実数のシーケンス.輪郭にのみ適用されます.等高線の線幅.数値の場合,すべてのレベルがこの線幅でプロットされます.シーケンスの場合,レベルは昇順で指定された順序の線幅でプロットされます.デフォルトは rcParams["lines.linewidth"]=1.5 です.
linestyles オプション: {None, 'solid', 'dashed', 'dashdot', 'dotted'}.輪郭にのみ適用されます.linestyles が None の場合,線がモノクロでない限り,デフォルトは 'solid'です. その場合,負の等高線は rcParams["contour.negative_linestyle"]='dashed' 設定から線スタイルを取ります.線種は,使用する線種のセットを指定する上記の文字列の反復可能にすることもできます. この反復可能オブジェクトが等高線レベルの数より短い場合,必要に応じて繰り返されます.
hatches オプション: 文字のリスト.contourf にのみ適用されます.塗りつぶされた領域で使用するクロスハッチパターンのリスト. None の場合,輪郭にハッチングは追加されません. ハッチングは,PostScript, PDF, SVG および Agg バックエンドでのみサポートされています.

ページ作成情報

参考資料

更新履歴

2019年10月19日 新規作成


no counter