Matplotlibで同じラベルを持つマーカーをグループ化し、凡例にまとめて表示する方法
Matplotlibでは、同じラベルを持つ複数の曲線やマーカーを、凡例上で1つのエントリにまとめて表示できます。これにより、y=sin(x) のように同じ数式を表す複数の線種(破線・一点鎖線など)を、ひとつの見出しの下に整理して配置することが可能です。
以下の手順で実装できます。
図のサイズを設定し、サブプロット間および周囲の余白を調整します。
Numpyを使って x のデータポイントを生成します。
plot()メソッドを使って、c1、c2、c3、c4 の4つの曲線を作成します。legend()を呼び出す際に、同じラベルの曲線をタプルとして渡すことで、凡例上でまとめて表示されるようにします。show()メソッドで図を表示します。
コード例
import numpy as np
from matplotlib import pyplot as plt, legend_handler
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
x = np.linspace(-10, 10, 100)
c1, = plt.plot(x, np.sin(x), ls='dashed', label='y=sin(x)')
c2, = plt.plot(x, np.sin(x+0.25), ls='dashdot', label='y=sin(x)')
c3, = plt.plot(x, np.cos(x), ls='solid', label='y=cos(x)')
c4, = plt.plot(x, np.cos(x+0.25), ls=':', label='y=cos(x)')
plt.legend([(c1, c2), (c3, c4)], ['y=sin(x)', 'y=cos(x)'], loc='upper right', handler_map={tuple: legend_handler.HandlerTuple(ndivide=None)})
plt.show()ポイント解説
このコードの鍵となるのは、legend() に渡す handler_map 引数です。legend_handler.HandlerTuple(ndivide=None) を指定することで、タプルとして渡された複数のLine2Dオブジェクトが、1つの凡例エントリ内に横並びで描画されます。ここで ndivide=None は、要素を分割せずにすべて並べて表示することを意味します。
また、第1引数に [(c1, c2), (c3, c4)]、第2引数に対応するラベルのリストを渡すことで、「sinの2本の曲線」と「cosの2本の曲線」がそれぞれグループ化され、各グループの上に共通のタイトル(ラベル)が付いた形で凡例が表示されます。
出力結果

実行すると、右上に「y=sin(x)」と「y=cos(x)」の2つの凡例エントリが表示され、それぞれのエントリ内に異なる線種の曲線サンプルが並んでいることが確認できます。この手法は、パラメータを変えた複数の類似データを視覚的に整理したい場合に非常に便利です。
-
Matplotlibで目盛りラベルをすべて表示する方法
Matplotlibでグラフ上のすべてのラベル値を表示したい場合は、set_xticklabels() メソッドと set_yticklabels() メソッドを使用します。この記事では、具体的な手順とコード例を使って、その方法をわかりやすく解説します。実装の手順軸の目盛りとして使用できる数値のリスト(x)を作成します。subplot() 関数を使用して軸オブジェクトを取得します。subplot() は現在の図にサブプロットを追加するための便利な関数です。set_xticks メソッドと set_yticks メソッドを使い、手順1で作成したリスト x を指定して、それぞれX軸とY軸の目盛り位
-
Matplotlibで2本の点線をプロットする方法|マーカー・線種・凡例の設定も解説
はじめに この記事では、Pythonの可視化ライブラリ「Matplotlib」を使って、2本の線を1つのグラフに描画し、それぞれに異なる線種(点線・破線)や色、太さを設定する方法を解説します。 コーディングを始める前に、まず次のコマンドでMatplotlibをインポートしておきましょう。 import matplotlib.pyplot as plt Pyplotは、MatplotlibをMATLABのように直感的に操作できるようにするためのコマンドスタイル関数のコレクションです。グラフの描画からラベル付けまで、ほとんどの操作をこのモジュール経由で行います。 アルゴリズム(処理の流れ) ステ