凡例の中に日本語タイトルを表示する【matplotlib】

スポンサーリンク

凡例の中に日本語タイトルを表示するには、セットタイトル set_title() を使います。以下のようなグラフが出せます。枠の中に「事業別の売上高」と表示できています。このセットタイトルメソッドは、ax.legend()の戻り値に用意されていました。その使い方を紹介します。

凡例に日本語タイトルを表示

さて、マットプロットリブのレジェンド設定にも、タイトル文字列を受け取るところがあるのですが、日本語フォントの設定が健康事業・美容事業・不動産事業にしか効かないんですね。以下のように設定しても、「事業別の売上高」が文字化けしてしまいました。

ax.legend(title='事業別の売上高', prop=fp_legend)

《レジェンド(legend) は凡例(はんれい)のことです》

どうやら、データ系列とタイトルのフォント設定は分かれているようです。公式マニュアルを調べたところ、凡例タイトル用のメソッドが用意されていました。

以下のようにすると、日本語タイトルのフォント設定ができて、「事業別の売上高」が出せました。

legend = ax.legend(prop=fp_legend_data)
legend.set_title('事業別の売上高', prop=fp_legend_title)

以下が公式マニュアルのページです。

legend and legend_handler – Matplotlib
set_title(title, prop=None)
https://matplotlib.org/api/legend_api.html?highlight=set_title#matplotlib.legend.Legend.set_title

Pythonのサンプルコードを書きました。凡例の枠の中に日本語タイトルを表示するコードです。冒頭のグラフを描くのに使用しました。ファイルパスなどは、個々の環境に合わせて変更してください。

日本語フォントは Google Noto Fonts の中の「Noto Sans CJK JP」を使用しています。

Google Noto Fonts
https://www.google.com/get/noto/

"""add_legend_title_jp.py"""
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties

def main():
    """テスト"""
    # フォントファイル
    font_file = r'D:\project\font\NotoSansCJKjp-hinted\NotoSansCJKjp-Regular.otf'

    # フォントプロパティ
    fp_legend_data = FontProperties(
                style='normal', weight='regular', size=10, fname=font_file)
    fp_legend_title = FontProperties(
                style='normal', weight='regular', size=12, fname=font_file)

    # 作図して表示 & 保存
    (fig, ax) = plt.subplots(ncols=1, nrows=1)
    try:
        # テスト画像生成
        x  = [ 1,  2,  3,  4]
        y1 = [ 3, 9,  27, 81]
        y2 = [15, 30, 45, 60]
        y3 = [10, 15, 20, 25]

        ax.set_xlim(0, 5)
        ax.set_ylim(0, 100)

        # プロット & 日本語ラベル設定
        ax.plot(x, y1, label='健康事業', lw=3, alpha=0.6, marker='o', ms=8)
        ax.plot(x, y2, label='美容事業', lw=3, alpha=0.6, marker='o', ms=8)
        ax.plot(x, y3, label='不動産事業', lw=3, alpha=0.6, marker='o', ms=8)

        ax.grid()

        # データ系列の凡例設定(フォントプロパティ指定) & レジェンドインスタンス取得
        legend = ax.legend(loc=2, framealpha=1.0, prop=fp_legend_data)

        # 凡例の中に日本語タイトルを追加 & フォントプロパティ指定
        legend.set_title('事業別の売上高', prop=fp_legend_title)

        fig.set_dpi(100)
        fig.set_figwidth(3.6)
        fig.set_figheight(3.6)

        # 表示
        plt.show()

        # 保存
        fig.savefig(r'D:\project\data_plot\add_legend_title_jp.png')
    finally:
        plt.close('all')
    return


if __name__ == '__main__':
    main()

メインのグラフタイトルが企業名などで埋まってると、データの分類とか、そういった説明を載せるところに迷うんですよね。それで、はじめは「事業別の売上高:健康事業、事業別の売上高:美容事業、…」などと表示していたのですが、凡例の中にタイトルが設定できると知って、上記のサンプルコードを書きました。作図の参考になれば幸いです。

タイトルとURLをコピーしました