matplotlib のグラフで、凡例の中に、日本語タイトルを表示する方法です。
凡例の中に『日本語タイトル』を追加するときは、ax.legend()
のセットタイトル .set_title()
メソッドを使います。
これで、以下のようなグラフが出せました。
枠の中に『事業別の売上高』と表示できています。
そのコード例を紹介します。
さて、マットプロットリブの『レジェンド設定』にも、タイトル文字列を受け取るところがあったのですが、日本語フォントの設定が健康事業・美容事業・不動産事業にしか効きませんでした。
以下のように設定しても、『事業別の売上高』が文字化けしてしまいました。
ax.legend(title='事業別の売上高', prop=fp_legend)
《レジェンド(legend) とは、凡例(はんれい)のことでした。》
どうやら、『データ系列のフォント設定』と『タイトルのフォント設定』は、分かれているようでした。
matplotlib マニュアルを調べたところ、凡例タイトル用のメソッドが用意されていました。
以下のようにしたら、日本語タイトルのフォント設定ができて、『事業別の売上高』が出せました。
legend = ax.legend(prop=fp_legend_data)
legend.set_title('事業別の売上高', prop=fp_legend_title)
以下が matplotlib マニュアルのページです。
(Matplotlib) set_title(self, title, prop=None)
Python のサンプルコードを書きました。
凡例の枠の中に、日本語タイトルを表示するコードです。
冒頭のグラフを描くのに使用しました。
ファイルパスなどは、個々の環境に合わせて変更してください。
日本語フォントは、Google Noto Fonts の中の『Noto Sans CJK JP』を使用しました。
"""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()
メインのグラフタイトルが企業名などで埋まってると、データの分類とか、そういった説明を載せるところに迷うんですよね。
それで、はじめは『事業別の売上高:健康事業、事業別の売上高:美容事業、…』などと表示していたのですが、凡例の中にタイトルが設定できると知って、上記のサンプルコードを書きました。
作図の参考になれば幸いです。