Matplotlibでデンドログラムの枝の長さを調整する方法
Matplotlibで階層的クラスタリングの結果を可視化する際、デンドログラム(樹状図)の枝の長さは、クラスタ間の距離を反映して自動的に描画されます。この記事では、SciPyとMatplotlibを使ってデンドログラムを作成し、その見た目や枝の長さを制御する基本的な方法を解説します。
手順
デンドログラムの枝の長さを調整しながら図を作成するには、以下の手順に従います。
図のサイズを設定し、サブプロット間および周囲の余白を調整します。
多変量正規分布からランダムなサンプル(a と b)を生成します。
concatenate() メソッドを使用して、既存の軸に沿って配列を結合します。
階層的クラスタリング(凝集型クラスタリング)を実行します。
figure() メソッドで新しい図を作成するか、既存の図をアクティブにします。
サブプロット配置の一部として、図に軸(Axes)を追加します。
dendrogram() メソッドを使用して、階層的クラスタリングをデンドログラムとして描画します。
図を表示するには、show() メソッドを使用します。
コード例
from matplotlib import pyplot as plt from scipy.cluster.hierarchy import dendrogram, linkage import numpy as np plt.rcParams["figure.figsize"] = [7.50, 3.50] plt.rcParams["figure.autolayout"] = True # 多変量正規分布からランダムサンプルを生成 a = np.random.multivariate_normal([0, 10], [[3, 1], [1, 4]], size=[2]) b = np.random.multivariate_normal([0, 10], [[3, 1], [1, 4]], size=[3]) # 配列を結合 X = np.concatenate((a, b), ) # 階層的クラスタリングを実行 Z = linkage(X) # 図とサブプロットを作成 fig = plt.figure() ax = fig.add_subplot(1, 1, 1) # デンドログラムを描画 dendrogram(Z, ax=ax) plt.show()
出力結果

枝の長さをさらに調整するポイント
デンドログラムの枝の長さは、データ間の距離(ユークリッド距離など)に基づいて決まります。表示を調整したい場合は、以下の方法が有効です。
truncate_mode パラメータ:'lastp' を指定すると、最後の p 個のクラスタのみを表示でき、大きなデータセットでもコンパクトな図になります。表示するクラスタ数は p パラメータで指定します。
linkage() の method 引数:'single'、'complete'、'average'、'ward' などのクラスタリング手法を変更すると、マージ距離が変わり、枝の長さも変化します。
color_threshold パラメータ:指定した距離を超える枝の色分けを制御できます。
ax.set_ylim():縦縦軸の範囲を変更することで、枝の見え方を調整できます。
これらのパラメータを組み合わせることで、データの特性に合わせた読みやすいデンドログラムを作成できます。
-
Matplotlibで開いているすべてのpyplotウィンドウを閉じる方法
Matplotlibで複数の図(figure)ウィンドウを開いたまま作業していると、メモリの無駄遣いや表示の混乱につながることがあります。この記事では、close()メソッドを使ってpyplotのウィンドウを閉じるさまざまな方法を解説します。close()メソッドの使い方一覧Matplotlibでは、状況に応じて以下のようにclose()を使い分けることができます。plt.figure().close():特定の図ウィンドウを閉じます。close():引数なしで呼び出すと、現在アクティブな図を閉じます。close(h):Figureインスタンス h を指定すると、その図だけを閉じます。clos
-
Matplotlibで凡例ボックスのサイズを調整する方法
Matplotlibの凡例ボックスのサイズを調整するには、legend()メソッドのborderpad引数を使用します。borderpadの値を大きくするほど、凡例ボックス内の余白が広がり、ボックス全体のサイズも大きくなります。手順異なる線幅(linewidth)を持つ2つのリストを使って、line1とline2を作成します。図に凡例を配置し、凡例ボックスのサイズを調整するために、legend()メソッドでborderpad=2を指定します。図を表示するには、show()メソッドを使用します。サンプルコードfrom matplotlib import pyplot as plt plt.rcP