matplotlib で作画した2軸のグラフでEXECLと決定的に違うところは、日本語対応です。何もしないと日本語のラベルは文字化けしてしまい、□□いわゆる豆腐になってしまいます。ブログで紹介した「matplotlibで二軸のグラフを作成する」やそれに注釈をつけた「二軸グラフに注釈をつける」では、いずれも英語のラベルや注釈でしたが、簡単に文字化けせず、日本語で表示する方法をご紹介します。

二軸グラフに注釈をつけるで使った月別の二軸のグラフの縦軸、横軸、注釈部分を日本語で表記する例について、MacOSX Big Surでの例をご紹介します。


日本語化のポイント

基本的には、japanize-matplotlib のパッケージを追加導入します 

  1. 日本語フォントIPAGothic をインストールします
  2. sns.set(font='IPAGothic')を指定します
  3. sns.setメソッドを以降、指定しないようにします。

参考: japanize-matplotlib

japanize-matplotlib のインストール

PIPコマンドでjapanize-matplotlib を追加します。 ホームディレクトリに追加してもいいですが、 パッケージをインストールすればするほど、システム全体の依存関係が複雑になります。 仮想環境にPIPで定番パッケージを導入するでもご紹介しているとおり、システム全体にインストールする前に仮想環境でテストされることをお薦めします。 実際の開発現場では少なからず行っていることです。

このインストールログでは、仮想環境名 (py37env) の中に入り、ホームディレクトリ配下のpythonというディレクトリの下でパッケージをインストールしています。仮想環境の作成については Python3.7と3.8両方を使うための仮想環境を作成する_(Mac_Big_Sur)の記事で仮想環境の作成方法を紹介しています。併せて参考にしてください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(py37env) ~/python % pip install japanize-matplotlib

Collecting japanize-matplotlib
  Downloading japanize-matplotlib-1.1.3.tar.gz (4.1 MB)
     |████████████████████████████████| 4.1 MB 5.4 MB/s 
Requirement already satisfied: matplotlib in ./py37env/lib/python3.7/site-packages (from japanize-matplotlib) (3.3.4)
Requirement already satisfied: numpy>=1.15 in ./py37env/lib/python3.7/site-packages (from matplotlib->japanize-matplotlib) (1.19.5)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 in ./py37env/lib/python3.7/site-packages (from matplotlib->japanize-matplotlib) (2.4.7)
Requirement already satisfied: cycler>=0.10 in ./py37env/lib/python3.7/site-packages (from matplotlib->japanize-matplotlib) (0.10.0)
Requirement already satisfied: kiwisolver>=1.0.1 in ./py37env/lib/

## 中略

Stored in directory: /Users/home/Library/Caches/pip/wheels/83/97/6b/e9e0cde099cc40f972b8dd23367308f7705ae06cd6d4714658
Successfully built japanize-matplotlib
Installing collected packages: japanize-matplotlib
Successfully installed japanize-matplotlib-1.1.3
(py37env) ~/python % 

IPAGothicフォントをインストールする

文字情報技術促進協議会のダウンロードページから ZIP形式をフォントをダウンロードして、ダブルクリックしてインストールします。利用規約には必ず目を通しましょう。


サンプルコード

ライン番号7から14が今回追加したところです。 それ以外は、タイトル、ラベルなどを日本語にしています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pylab import rcParams
import seaborn as sns

# 日本語表記のためのモジュールをインポートする
import japanize_matplotlib

sns.set(font='IPAGothic')
# 以降 sns.setは使わないこと上書きされてしまう
plt.rcParams['font.family'] = 'IPAexGothic'

%matplotlib inline

# 図のサイズを9inch x 6inch = 648px X 432px にする
rcParams['figure.figsize'] = 9,6

# 描画用のデータフレームを作成
df = pd.DataFrame({'Month': ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],
                   'Revenue': [120, 200, 24, 70, 120, 230, 24, 70, 120, 211, 24, 70],
                   'Rate': [0.12, 0.84, 0.66, 0.3, 0.43, 0.86, 0.11, 0.29, 0.11, 0.77, 0.54, 0.33]},
                    index=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ])

# データフレームの各列をリスト形式の変数で受ける
month = df['Month']
x = month.values
y1 = df['Revenue']
y1 = y1.values
y2 = df['Rate']
y2 = y2.values

# 第一軸(ax1)と第二軸(ax2)を作ってax1 が左側の第一軸に、ax2 が右側で第二軸になります
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()

#y1, y2軸それぞれの範囲を設定する
ax1.set_ylim([0, 250])
ax2.set_ylim([0, 1.1])

# グリッドは第一軸のみとする
ax1.grid(True)
ax2.grid(False)

#第一軸が棒グラフ、第二軸が折れ線グラフで描画する
ax1.bar(x, y1, label='# of Cases', color="lightblue" )
ax2.plot(x, y2, linewidth=2, color='orange', linestyle='solid', marker='o', markersize=8, label='成功率')

#タイトル、軸ラベル、凡例の表示、x軸のラベル(month)は70度傾ける
ax1.set_title('2020年 with annotation', pad=8, fontsize=20, color='blue')
ax1.set_ylabel('訪問件数')
ax2.set_ylabel('成功率')
ax1.set_xlabel('月')
ax1.tick_params(axis='x', rotation=70)
ax1.legend(bbox_to_anchor=(0, 1), loc='upper left', borderaxespad=0.5, fontsize=10)
ax2.legend(bbox_to_anchor=(0, 0.95), loc='upper left', borderaxespad=0.5, fontsize=10)

# 棒グラフの最大値の値とインデックス番号(x軸の番号)を計算する
max = y1.max()
index_of_max = np.argmax(y1)

# 注釈の位置(index_of_max_next)は、インデックス番号の一つ右(+1)とする
index_of_max_next = index_of_max + 1

# 最大値の月を"Peak of Month"と注釈(annotation)を付ける
ax1.annotate('ピーク月', xy= (index_of_max, max), xytext=(index_of_max_next, max ),
           arrowprops=dict(facecolor='red', shrink=0.05))

plt.show()

# 描画した画像をカレントディレクトリにセーブする
fig.savefig('img_02_13.png')

結果の図

以下のような図が描画されると思います。

two_axis


ひとこと

分析したデータを可視化するにあたり、グラフ自体の自己説明力は欠かせません。日本語化の利点は、オーディエンスが全て日本人であれば、できるだけ日本語にした方が、図への理解度の速さは英語とは格段によくなります。特に、説明するチャートが多ければ多いほど、直ぐに分かる(分からせる)ことが大切です。キーとなるチャートのタイトル、注釈、ラベルは日本語にするのも一手ですね。


参照ページ一覧

本ブログは、以下のネットの記事等を参考に作成しました。 

1) seaborn countplot の棒グラフに度数のannotationをつける
2) seaborn barplot の棒グラフに平均値のannotationをつける
3) seaborn barplot で棒グラフを隣接させY軸、annotationをパーセント表示する
4) seaborn
5) matplotlib
6) EXCELの達人からPythonの達人へ:住民基本台帳年齢階級別人口から都道府県別人口を作成する