Python 整数データ(x, y)の組み合わせ数を元に等高線図を描く

 本記事では、下図のような等高線図を描く雛形コードを載せました。

 下図は、上図を描いた数値データです。この例では、Xの値は1~10の整数、Yの値は1~8の整数の値をとっています。上図は、その組み合わせ「頂点座標(X, Y)」の数を全体数で割った割合を等高線で図示しています。

■本プログラム

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
plt.rcParams['font.size'] = 15  # グラフの基本フォントサイズの設定

# CSVファイルを読み込む
file_path = 'test_data.csv'
data = pd.read_csv(file_path)

x_name, y_name = 'X', 'Y'

# 必要な列だけをフィルタリング
data = data[[x_name, y_name]]

# 行数を計算
num_rows = len(data)

# ピボットテーブルを作成し、各値の出現回数をカウント
pivot_table = data.pivot_table(index=x_name, columns=y_name, aggfunc='size', fill_value=0)

# カウントを割合に変換
proportions = pivot_table / num_rows * 100

# 等高線プロット用のメッシュグリッドを作成
X, Y = np.meshgrid(proportions.columns, proportions.index)
Z = proportions.values

cmap = plt.colormaps.get_cmap('bwr')

# 等高線プロットを作成
fig, ax = plt.subplots(figsize=(8, 6))
cp = ax.contourf(X, Y, Z, cmap=cmap)
plt.colorbar(cp, label='割合')

# x軸とy軸の目盛りを手動で設定
ax.set_xticks(np.arange(1, 11))
ax.set_xticklabels(np.arange(1, 11))

# y軸の目盛りを手動で設定
ax.set_yticks(np.arange(1, len(proportions.index) + 1))
ax.set_yticklabels(np.arange(1, len(proportions.index) + 1))

ax.set_aspect('equal', 'box')
plt.grid(True)
plt.xlabel(x_name)
plt.ylabel(y_name)
plt.title(f'{x_name} と {y_name} の等高線図', fontsize=14)
plt.show()

以上

<広告>