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