Matplotlibで異なるスケールの軸を使ってプロットする方法
Matplotlibでは、twinx()メソッドを使ってX軸を共有する2つのY軸(双子軸)を作成することで、異なるスケールのデータを同じグラフ上にプロットできます。以下に、その具体的な手順とサンプルコードを紹介します。
実装手順
- 図のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整します。
- NumPyを使用して、t、data1、data2 のデータポイントを作成します。
- plt.subplots()で図と最初の軸 ax1 を作成します。
- 色を格納する変数を初期化します。
- 1つ目の軸にX軸・Y軸のラベルを設定します。
- plot()メソッドで t と data1 をプロットします。
- tick_params()メソッドを使って目盛りラベルの色を設定します。
- twinx()メソッドでX軸を共有する2つ目の軸 ax2 を作成します。
- 2つ目の軸でも同様に、別のデータセットに対してラベル設定・プロット・目盛り色の設定を行います。
- show()メソッドで図を表示します。
サンプルコード
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
t = np.arange(0.01, 10.0, 0.01)
data1 = np.exp(t)
data2 = np.sin(2 * np.pi * t)
fig, ax1 = plt.subplots()
color = 'red'
ax1.set_xlabel('time (s)')
ax1.set_ylabel('exp', color=color)
ax1.plot(t, data1, color=color)
ax1.tick_params(axis='y', labelcolor=color)
ax2 = ax1.twinx()
color = 'blue'
ax2.set_ylabel('sin', color=color)
ax2.plot(t, data2, color=color)
ax2.tick_params(axis='y', labelcolor=color)
plt.show()実行結果
このコードを実行すると、左側のY軸に赤色の指数関数(exp)、右側のY軸に青色の正弦波(sin)が表示され、それぞれ異なるスケールで1つのグラフ上に描画されます。各軸のラベルと目盛りの色が対応する曲線の色と一致しているため、どちらの軸がどのデータに対応しているかがひと目でわかります。

ポイント解説
twinx()は、既存のAxesオブジェクトからX軸を共有する新しいAxesを生成するメソッドです。これにより、単位や桁数が大きく異なる2つのデータ系列(例:温度と売上、時間とログ値など)を比較しやすくなります。また、tick_params(axis='y', labelcolor=...)で目盛りラベルの色を曲線と揃えることで、グラフの可読性が大幅に向上します。
-
Matplotlibで折れ線グラフをアニメーション化する方法を徹底解説
Matplotlibでは、FuncAnimationを活用することで、折れ線グラフに動きのあるアニメーション効果を簡単に加えることができます。本記事では、基本的な手順と実際に動作するサンプルコードを交えながら、その方法をわかりやすく解説します。折れ線グラフをアニメーション化する基本手順subplots()メソッドを使用して、図(figure)とサブプロットを作成します。x軸・y軸それぞれの表示範囲(スケール)を設定します。NumPyを使って、xおよびtのデータ点を生成します。座標ベクトルからmeshgrid()で座標行列X2とT2を作成します。plot()メソッドでxとFのデータを使い、折れ線
-
Matplotlibを使ってPythonで3D密度マップを描画する方法を徹底解説
MatplotlibとNumPyを組み合わせると、Pythonで簡単に3D密度マップ(濃度分布図)を作成できます。本記事では、pcolormesh()メソッドを使って擬似カラープロットとして密度マップを可視化する具体的な手順を、サンプルコード付きでわかりやすく解説します。 3D密度マップを描画する基本の手順 NumPyでデータを生成する:side、x、y、zの各データをNumPyで作成します。特にlinspace関数を使うと、指定した2点間の範囲を任意の分割数で等間隔にデータ生成できるため便利です。 座標行列を作成する:sideデータをもとにmeshgrid()を使い、座標ベクトルから2次元