【化学でPython】matplotlib:実験・計算データをきれいなグラフで手軽に可視化する
はじめに
この「化学でPython」シリーズでは、化学の分野で有用な Python ライブラリを紹介しています。
今回紹介するのは、matplotlib です。
matplotlib とは?
Python でグラフを描画するためのデファクトスタンダード(事実上の標準)と言えるライブラリです。
実験データのプロット、スペクトルの表示、シミュレーション結果の可視化など、あらゆる場面で必須のツールです。
インストール
pip で簡単にインストールできます。
pip install matplotlib
基本的な使い方
まずは、最も基本的な使い方を見てみましょう。
ここでは、単純なサインカーブを描いてみます。
import matplotlib.pyplot as plt
import numpy as np
# データの作成(0から2πまでを100分割)
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)
# グラフの描画
plt.figure(figsize=(6, 4)) # 図のサイズを指定
plt.plot(x, y, label='sin(x)') # 折れ線グラフを描画
plt.title('Basic Sine Wave') # タイトル
plt.xlabel('x') # x軸ラベル
plt.ylabel('y') # y軸ラベル
plt.legend() # 凡例を表示
plt.grid(True) # グリッド線を表示
plt.show() # グラフを表示

実行結果
実践例: 反応速度解析(反応次数の決定)
実践的な例として、「実験データから反応次数を決定する」 タスクをやってみます。
ある反応物 A が分解していく反応において、時間ごとの濃度データが得られたとします。このデータから、反応が 1次反応 なのか 2次反応 なのかをグラフを使って判定してみましょう。
1. 生データの可視化
まずは得られた実験データ(時間 vs 濃度)をそのまま散布図としてプロットし、全体の傾向を確認します。
import matplotlib.pyplot as plt
import numpy as np
# 仮想的な実験データ(時間 t [s], 濃度 [A] [mol/L])
time = np.array([0, 10, 20, 30, 40, 50, 60, 70, 80])
conc = np.array([1.00, 0.82, 0.67, 0.55, 0.45, 0.37, 0.30, 0.25, 0.20])
# 散布図でプロット
plt.figure(figsize=(6, 4))
plt.scatter(time, conc, color='blue', label='Experimental Data')
plt.title('Concentration vs Time')
plt.xlabel('Time / s')
plt.ylabel('[A] / mol L$^{-1}$') # TeX記法で上付き文字などを綺麗に書けます
plt.legend()
plt.grid(True)
plt.show()

実行結果
濃度が時間とともに減少していることがわかりますが、これだけでは反応次数はわかりません。
2. 反応次数の判定プロット
化学反応速度論の知識を使います。
-
1次反応の場合:
vs\ln[A] が直線になる。t -
2次反応の場合:
vs1/[A] が直線になる。t
この2つのグラフを並べて描画(サブプロット)し、どちらが直線に近いかを確認します。
# データの変換
ln_conc = np.log(conc) # 自然対数
inv_conc = 1.0 / conc # 逆数
# 2つのグラフを横に並べて描画
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# 左:1次反応プロット (ln[A] vs t)
axes[0].scatter(time, ln_conc, color='green')
axes[0].set_title('1st Order Plot: ln[A] vs t')
axes[0].set_xlabel('Time / s')
axes[0].set_ylabel('ln([A])')
axes[0].grid(True)
# 近似直線を追加(np.polyfitで1次式近似)
slope1, intercept1 = np.polyfit(time, ln_conc, 1)
axes[0].plot(time, slope1 * time + intercept1, 'r--', label=f'R$^2$ check needed')
axes[0].legend()
# 右:2次反応プロット (1/[A] vs t)
axes[1].scatter(time, inv_conc, color='orange')
axes[1].set_title('2nd Order Plot: 1/[A] vs t')
axes[1].set_xlabel('Time / s')
axes[1].set_ylabel('1/[A] / L mol$^{-1}$')
axes[1].grid(True)
# 近似直線を追加
slope2, intercept2 = np.polyfit(time, inv_conc, 1)
axes[1].plot(time, slope2 * time + intercept2, 'r--')
plt.tight_layout() # レイアウトの自動調整
plt.show()

実行結果
作成されたグラフを見ると、左側のプロット(
これにより、この反応は1次反応である可能性が高いと判断できます。また、1次反応プロットの直線の傾き(slope1)の絶対値が、反応速度定数
このように、matplotlib を使えば、データの傾向を視覚化し、化学的な解析を直感的に行うことができます。
まとめ
今回は matplotlib を紹介しました。
- Point 1: Python でグラフを描くならまずはこれ。機能が豊富です。
-
Point 2:
plt.plot()やplt.scatter()で簡単にデータを可視化できます。 - Point 3: 軸ラベルに数式を使ったり、複数のグラフを並べたりと、論文執筆にも使えます。
実験レポートや学位論文のグラフ作成などに、ぜひ matplotlib を活用してみてください。Excel とは一味違う、自由度の高い解析ができるようになりますよ。
Discussion
Pythonが化学分野の発展に貢献してるのを嬉しく思います。