Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Matplotlib】折れ線グラフの線の色をデータインデックスに応じて変化させる方法

Matplotlibで折れ線グラフを描く際、データのインデックス(位置)に応じて線の色を変えたいケースはよくあります。例えば、sin波の傾き(微分値)によって色を変化させれば、グラフの変化の様子をひと目で把握できます。

このような「多色折れ線」を実現するには、LineCollectionを使用します。以下に具体的な手順とサンプルコードを紹介します。

実装手順

  1. 図のサイズを設定し、サブプロット間・周囲の余白(パディング)を調整します。
  2. NumPyを使ってx座標とy座標のデータポイントを作成します。
  3. 隣接点の中間値からdydx(傾きに相当する値)を計算します。
  4. NumPyを使ってpoints(各点の座標)とsegments(線分の始点・終点)を作成します。
  5. 図とサブプロットのセットを作成します。
  6. データを指定した範囲に線形正規化するためのノーマライザー(Normalize)を設定します。
  7. LineCollectionにカラーマップとノームを渡し、set_array()で色の基準となる配列を設定します。
  8. set_linewidth()で線の太さを指定します。
  9. fig.colorbar()でカラーバーを追加し、色と数値の対応を可視化します。
  10. 色リスト(赤・緑・青など)からListedColormapオブジェクトを生成し、別の配色パターンでも同様の処理を行います。
  11. X軸・Y軸の表示範囲を設定します。
  12. show()メソッドで図を表示します。

サンプルコード

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from matplotlib.colors import ListedColormap, BoundaryNorm

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

x = np.linspace(0, 3 * np.pi, 500)
y = np.sin(x)

dydx = np.cos(0.5 * (x[:-1] + x[1:]))
points = np.array([x, y]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)

fig, axs = plt.subplots(2, 1, sharex=True, sharey=True)
norm = plt.Normalize(dydx.min(), dydx.max())

lc = LineCollection(segments, cmap='viridis', norm=norm)
lc.set_array(dydx)
lc.set_linewidth(2)

line = axs[0].add_collection(lc)
fig.colorbar(line, ax=axs[0])
cmap = ListedColormap(['r', 'g', 'b'])
norm = BoundaryNorm([-1, -0.5, 0.5, 1], cmap.N)

lc = LineCollection(segments, cmap=cmap, norm=norm)
lc.set_array(dydx)
lc.set_linewidth(2)

line = axs[1].add_collection(lc)
fig.colorbar(line, ax=axs[1])

axs[0].set_xlim(x.min(), x.max())
axs[0].set_ylim(-1.1, 1.1)

plt.show()

実行結果

上記のコードを実行すると、次のような出力が得られます。

  • 上段のグラフ: viridisカラーマップを使用し、dydxの値に応じて連続的に色が変化します。カラーバーで数値との対応が確認できます。
  • 下段のグラフ: 赤・緑・青の3色をBoundaryNormで区切ることで、dydxの範囲ごとに離散的な色分けが行われます。

【Matplotlib】折れ線グラフの線の色をデータインデックスに応じて変化させる方法

ポイント解説

通常のplt.plot()では1つのplot呼び出しに対して単一の色しか指定できませんが、LineCollectionを使えば線分ごとに異なる色を割り当てられます。set_array()に渡す配列の値がカラーマップを通じて色に変換される仕組みです。

また、ListedColormapBoundaryNormを組み合わせると、「一定の閾値ごとに色を切り替える」といった離散的な色分けも簡単に実装できます。データの変化率や特定条件の可視化にぜひ活用してください。

  1. Matplotlibで離散値のヒストグラムを描く方法

    Matplotlibを使って離散値(とびとびの値)のデータからヒストグラムを作成するには、hist()メソッドを利用します。この記事では、具体的な手順とサンプルコードをわかりやすく解説します。 手順 figure.figsizeで図のサイズを設定し、figure.autolayoutを有効にして、サブプロット間や周囲の余白を自動調整します。 ヒストグラムとして可視化したい離散値のリストを作成します。 hist()メソッドを使ってデータをプロットします。このとき、bins引数にデータの長さを指定し、edgecolor=blackで各バーの枠線を黒色にすると、離散的な値が見やすくなります。 sh

  2. Matplotlibでヒストグラムデータから折れ線グラフを描画する方法

    Matplotlibでヒストグラムのデータをもとに折れ線グラフを描画するには、NumPyのhistogram()メソッドを使ってデータセットのヒストグラムを事前に計算しておくのが便利です。この記事では、同じデータをヒストグラムと折れ線グラフの両方で可視化する手順を解説します。実装の手順現在の図にサブプロットを追加します。nrows=2、ncols=1とし、index=1を指定します。NumPyのhistogram()メソッドを使用して、データセットのヒストグラム(度数とビンの境界値)を取得します。edgecolor=blackを指定してhist()メソッドでヒストグラムを描画します。インデック