🧪

【化学でPython】matplotlib:実験・計算データをきれいなグラフで手軽に可視化する

に公開1

はじめに

この「化学でPython」シリーズでは、化学の分野で有用な Python ライブラリを紹介しています。

今回紹介するのは、matplotlib です。

matplotlib とは?

Python でグラフを描画するためのデファクトスタンダード(事実上の標準)と言えるライブラリです。

実験データのプロット、スペクトルの表示、シミュレーション結果の可視化など、あらゆる場面で必須のツールです。

  • 公式サイト: Link
  • GitHub: Link (⭐️ 22k)

インストール

pip で簡単にインストールできます。

terminal
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次反応の場合:\ln[A] vs t が直線になる。
  • 2次反応の場合:1/[A] vs 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()


実行結果

作成されたグラフを見ると、左側のプロット(\ln[A] vs t)の方が綺麗に直線に乗っていることが視覚的にわかります。

これにより、この反応は1次反応である可能性が高いと判断できます。また、1次反応プロットの直線の傾き(slope1)の絶対値が、反応速度定数 k に相当します。

このように、matplotlib を使えば、データの傾向を視覚化し、化学的な解析を直感的に行うことができます。

まとめ

今回は matplotlib を紹介しました。

  • Point 1: Python でグラフを描くならまずはこれ。機能が豊富です。
  • Point 2: plt.plot()plt.scatter() で簡単にデータを可視化できます。
  • Point 3: 軸ラベルに数式を使ったり、複数のグラフを並べたりと、論文執筆にも使えます。

実験レポートや学位論文のグラフ作成などに、ぜひ matplotlib を活用してみてください。Excel とは一味違う、自由度の高い解析ができるようになりますよ。

参考リンク

Discussion

KvraKvra

Pythonが化学分野の発展に貢献してるのを嬉しく思います。