Matplotlib は、Python と NumPy のためのプロットライブラリです。Tkinter、wxPython、Qt、GTK のような汎用 GUI ツールキットを使ったアプリケーションにプロットを埋め込むためのオブジェクト指向 API を提供しています。
いくつものパラメータで、ある特性の最適点を探索するとき、興味がある2つのパラメータとその特性の関係を視覚化したい場合があります。(他のパラメータ値を固定した上で)2つのパラメータを変動させて、メッシュ状に総当たりのデータを用意できれば、Matplotlib の countour で等高線図を作成することができます。
数式からループを回して大きなメッシュ状のデータを用意して見た目に美しい等高線図を作成したことはあっても、生のデータから直接作成したことがありませんでした。どちらもやっていることは本質的には同じなのですが、あらためて少ないデータから等高線図を作ってみると、線形モデルを前提としなくとも、データの挙動をざっくり捉えるには使えそうだと思ったので、備忘録にまとめました。
下記の OS 環境で動作確認をしています。
![]() |
Fedora Linux 41 Workstation | x86_64 |
Python | 3.13.2 | |
jupyterlab | 4.3.5 | |
matplotlib | 3.10.0 | |
numpy | 2.2.2 | |
pandas | 2.2.3 |
以下の作業は JupyterLab 上でおこなっています。
最初に必要なライブラリをインポートします。
import matplotlib.ticker as ticker import matplotlib.pyplot as plt import numpy as np import pandas as pd |
等高線図用データの準備
サンプルの CSV データを読み込みます。ファイル sample_contour.csv は下記からダウンロードできます。
sample_contour.csv |
csvfile = 'sample_contour.csv' df = pd.read_csv(csvfile) df.head( 10 ) |
このデータは、X と Y それぞれのパラメータを一つずつ変化させて全ての組み合わせで Z を取得した総当たりのデータです。
X の値は下記のように 3 から 7 までの 5 つの整数です。
df[ 'X' ].unique() |
array([3, 4, 5, 6, 7])
X のユニークな数 (5) を n_x に保存しておきます。
n_x = len (df[ 'X' ].unique()) |
Y の値は下記のように 0 から 5 までの 6 つの整数です。
df[ 'Y' ].unique() |
array([0, 1, 2, 3, 4, 5])
Y のユニークな数 (6) を n_y に保存しておきます。
n_y = len (df[ 'Y' ].unique()) |
データフレームの列を Y, X の順番でソートします。
df.sort_values([ 'Y' , 'X' ], ignore_index = True , inplace = True ) df.head( 10 ) |
matplotlib の concour に渡す二次元配列 x, y, z を用意します。二次元配列は縦横のサイズが同じである必要があります。
データフレーム df から X, Y, Z 列を Series で取り出し、numpy の配列にした後、n_y 行 × n_x 列の二次元配列に整形します。
x = np.array(df[ 'X' ]).reshape([n_y, n_x]) y = np.array(df[ 'Y' ]).reshape([n_y, n_x]) z = np.array(df[ 'Z' ]).reshape([n_y, n_x]) |
x |
array([[3, 4, 5, 6, 7], [3, 4, 5, 6, 7], [3, 4, 5, 6, 7], [3, 4, 5, 6, 7], [3, 4, 5, 6, 7], [3, 4, 5, 6, 7]])
y |
array([[0, 0, 0, 0, 0], [1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5]])
z |
array([[ 900., 550., 450., 150., -250.], [ 800., 250., 300., 200., -100.], [ 150., -300., -150., -450., -450.], [ 400., -50., 100., -200., -200.], [ 450., 0., 150., -150., -150.], [ 450., 0., 150., -150., -150.]])
等高線図のプロット
matplotlib の coucour で、二次元配列 x, y, z の等高線図をプロットします。
plt.rcParams[ 'font.family' ] = 'monospace' fig = plt.figure(figsize = ( 6 , 6 )) ax = fig.add_subplot( 111 ) cont = ax.contour( x, y, z, linestyles = 'solid' , linewidths = 1 , ) cont.clabel(fmt = '%.f' , fontsize = 12 ) ax.xaxis.set_major_locator(ticker.MultipleLocator( 1 )) ax.yaxis.set_major_locator(ticker.MultipleLocator( 1 )) ax.xaxis.set_tick_params(labelsize = 12 ) ax.yaxis.set_tick_params(labelsize = 12 ) ax.set_xlabel( 'X' , fontsize = 14 ) ax.set_ylabel( 'Y' , fontsize = 14 ) ax.grid() plt.tight_layout() plt.show() |
凸凹な等高線図ですが、これでもパラメータの変化にどのように依存するかの傾向を捉えることができます。
実用的には数あるパラメータから、JupyterLab 上であれこれパラメータを変えてプロットを作成するのは手間なので、PySide6 で GUI を用意して、使い勝手を良くしています。GUI を用意するのに時間がかかりますが、そこそこ使えるようにしてしまえば、あとは改善を重ねてどんどん使いやすくできます。
参考サイト

にほんブログ村
#オープンソース

0 件のコメント:
コメントを投稿