拙著「Pythonでデータ分析」の第2章「グラフ描画」の補足説明と更新
ライブラリmatplotlibを用いてグラフ描画を行うとき、日本語も使用できる。ライブラリjapanize_matplotlibを用いる方法とmatplotlibのfont familyを指定する方法について説明する。
まず、japanize_matplotlibを用いる方法を説明する。最後に、font familyで指定する方法について説明する。
スクリプトファイルは、圧縮ファイルc02files.zipにまとめている。ダウンロード・展開して自由に利用されたい。
ライブラリjapanize_matplotlibはコマンド
pip install
japanize_matplotlib
の実行でインストールできる。
拙著のリスト2.1.1のスクリプトを以下のように書き変えた。
import matplotlib.pyplot as plt
import japanize_matplotlib
values = [24, 10, 5]
index = [0, 1, 2]
plt.bar(index, values)
names = ['心理学>\n臨床心理学', '心理学≒\n臨床心理学', 'その他']
# \nは改行を表す
plt.xticks(index, names, fontsize =
18)
plt.ylabel('回答者数(人)', fontsize = 18)
plt.tight_layout()
# グラフが枠をはみ出さないように調整
plt.savefig('FigBar.png') # 描画グラフのファイルへの保存
plt.show()
上のスクリプトを実行すると下図のグラフが表示される。
拙著のリスト2.2.1を以下のように日本語対応に書き換えた。
import matplotlib.pyplot as plt
import japanize_matplotlib
Htemp = [30.1, 30.7, 25.2, 26.0, 30.5,
25.3, 28.1, 31.4, 30.5, 29.1,
28.5, 30.7, 28.3, 26.3, 29.5, 31.2, 32.0, 30.1, 26.4, 29.0,
28.2, 29.4, 29.6, 29.6, 27.7, 26.9, 30.2, 28.3, 31.3, 28.0,
31.1, 27.0, 30.0, 29.2, 29.8, 28.1, 29.5, 28.4, 28.5, 28.6,
27.6, 29.3, 30.5, 28.4, 30.3, 28.3, 26.4, 28.7, 29.7]
Ltemp = [11.9, 14.5, 12.4, 12.8, 17.0,
18.1, 15.9, 16.0, 17.4, 18.5,
19.4, 17.7, 19.1, 15.6, 17.5, 17.9, 16.2, 15.5, 17.2, 16.5,
19.4, 18.7, 19.8, 19.6, 16.9, 19.1, 19.4, 19.9, 18.9, 17.4,
17.1, 18.8, 15.9, 16.8, 16.8, 18.0, 16.7, 17.6, 17.9, 17.3,
17.5, 20.5, 19.9, 18.7, 18.9, 18.4, 20.0, 21.9, 23.9]
plt.title('最高気温と最低気温', fontsize = 16)
plt.xlabel('気温($^\circ\mathrm{C}$)', fontsize = 14)
plt.ylabel('頻度', fontsize = 14)
plt.hist(Htemp, color = '#FFAA00',
alpha = 0.7, label = '最高気温')
plt.hist(Ltemp, color = '#0000AA',
alpha = 0.7, label = '最低気温')
plt.legend(fontsize = 14)
plt.savefig('FigHists.png')
plt.show()
実行すると下図のグラフが表示される。
拙著のリスト2.3.2のスクリプトを以下のように書き変えた。
import matplotlib.pyplot as plt
import numpy as np
import japanize_matplotlib
City = ['旭川', '札幌',
'函館', '青森', '盛岡',
'仙台', '秋田',
'山形', '福島', '東京',
'横浜', '熊谷',
'千葉', '水戸', '宇都宮',
'前橋', '甲府',
'長野', '新潟', '富山',
'金沢', '福井',
'名古屋', '岐阜', '静岡',
'津', '大阪',
'神戸', '京都', '彦根',
'奈良', '和歌山', '鳥取', '松江', '岡山',
'広島', '山口',
'徳島', '高松', '松山',
'高知', '福岡',
'佐賀', '長崎', '熊本',
'大分', '宮崎',
'鹿児島', '那覇']
Htemp = [30.1, 30.7, 25.2, 26.0, 30.5,
25.3, 28.1, 31.4, 30.5, 29.1,
28.5, 30.7, 28.3, 26.3, 29.5, 31.2, 32.0, 30.1, 26.4, 29.0,
28.2, 29.4, 29.6, 29.6, 27.7, 26.9, 30.2, 28.3, 31.3, 28.0,
31.1, 27.0, 30.0, 29.2, 29.8, 28.1, 29.5, 28.4, 28.5, 28.6,
27.6, 29.3, 30.5, 28.4, 30.3, 28.3, 26.4, 28.7, 29.7]
Ltemp = [11.9, 14.5, 12.4, 12.8, 17.0,
18.1, 15.9, 16.0, 17.4, 18.5,
19.4, 17.7, 19.1, 15.6, 17.5, 17.9, 16.2, 15.5, 17.2, 16.5,
19.4, 18.7, 19.8, 19.6, 16.9, 19.1, 19.4, 19.9, 18.9, 17.4,
17.1, 18.8, 15.9, 16.8, 16.8, 18.0, 16.7, 17.6, 17.9, 17.3,
17.5, 20.5, 19.9, 18.7, 18.9, 18.4, 20.0, 21.9, 23.9]
plt.figure(figsize = (10, 8)) # in inches
plt.xlim(24, 34)
plt.ylim(10, 25)
plt.title('散布図(最高温度、最低温度)', fontsize = 20)
plt.xlabel('最高温度 ($^\circ\mathrm{C}$)',
fontsize = 18)
plt.ylabel('最低温度 ($^\circ\mathrm{C}$)',
fontsize = 18)
plt.plot(Htemp, Ltemp, 'bo', alpha =
0.6)
for ID, H, L in zip(City, Htemp,
Ltemp):
plt.text(H + 0.1, L + 0.1,
ID, color = 'b', alpha = 0.6)
MeanH = np.mean(Htemp)
plt.vlines(MeanH, 10, 25, linestyle =
'--', color = '#FFAA00AA',
label = '平均最高気温({0:.1f}'.format(MeanH) +
'$^\circ\mathrm{C}$)')
MeanL = np.mean(Ltemp)
plt.hlines(MeanL, 24, 34, linestyle =
'--', color = '#00AAFFAA',
label = '平均最低気温({0:.1f}'.format(MeanL) +
'$^\circ\mathrm{C}$)')
plt.legend(fontsize = 14)
plt.savefig('FigScatter.png')
plt.show()
実行すると下図の散布図が描画される。
拙著のリスト2.4.1を日本語表記にするために以下のように変更した。
import matplotlib.pyplot as plt
import japanize_matplotlib
Days = [5, 6, 7, 8, 9, 10, 11, 12, 13,
14]
MaxTemp = [28, 24, 25, 27, 27, 25, 25,
27, 28, 25]
MinTemp = [18, 20, 17, 17, 20, 20, 19,
16, 17, 18]
plt.title('10日間の天気予報', fontsize = 16)
plt.plot(Days, MaxTemp, 'rD',
markersize = 9)
plt.plot(Days, MinTemp, 'bs',
markersize = 9)
plt.plot(Days, MaxTemp, 'r-', linewidth
= 3, label = '最高気温')
plt.plot(Days, MinTemp, 'b-',
linewidth = 3, label = '最低気温')
plt.xlim(4, 15)
plt.xticks(fontsize = 14) # 横軸のメモリ表示文字のサイズを14に指定
plt.ylim(15, 30)
plt.yticks(fontsize = 14)
plt.legend(fontsize = 14)
plt.xlabel('日', fontsize = 18)
plt.ylabel('気温($^\circ\mathrm{C}$)',
fontsize = 16)
plt.tight_layout()
plt.savefig('FigTwoLines.png')
plt.show()
上のスクリプトを実行すると下図のグラフが表示される。
使用フォントを選ぶときは、font familyにフォント名を指定するとよい。
使用できるフォント名は、matplotlib.font_manager.fontManager.ttflist から得ることができる。
次のスクリプトは、使用できるフォント名とそのフォントによる文字表示を行うものである。
import matplotlib.pyplot as plt
import matplotlib.font_manager as mf
fnts = [ f.name for f in
mf.fontManager.ttflist]
# フォント名のリスト
try:
pos = 0
while True:
plt.figure(figsize = (12, 7))
plt.title(f'From {pos} to {pos+29}, Total = {len(fnts)}\n')
plt.plot([0, 20, 20, 0, 0], [0, 0, -10, -10, 0], lw = 0)
plt.xticks([])
plt.yticks([])
for
i in range(15):
plt.text(1, -0.7*i, '日本語です' + ':' + fnts[pos + i],
fontfamily = fnts[pos + i], fontsize = 16)
for
i in range(15):
plt.text(10, -0.7*i, '日本語です' + ':' + fnts[pos + 15 + i],
fontfamily = fnts[pos + 15 + i], fontsize = 16)
plt.show()
if
input('Go to the next set? (y/n) ') != 'y':
break
else:
pos += 30
except Exception as e:
plt.show()
print(e)
上のスクリプトでは、次のコード
fnts = [ f.name for f in mf.fontManager.ttflist]
により、使用できるフォント名のリストをfntsに得ている。
上のスクリプトでは、得たフォントのリストからフォントを30個ずつ順番に表示している。上のスクリプトを実行すると、各フォントに対応する日本語文字「日本語です」の表示画面が提示される。
日本語に対応していないフォントでは、文字は正しく表示できない。
表示フォームを閉じる(右上角のXをクリック)と、端末には次のフォントセットを表示するかどうかの確認メッセージが提示される。
Go to the
next set? (y/n) y
「y」と入力すると、次の画面が表示される。
上記のスクリプトによりフォントを表示させていくことができるので、適当なフォントを選ぶことができる。
選んだフォントは、上のスクリプトのように描画コマンドごとに指定することもできるが、スクリプト全体にわたって同じスクリプトで描画するときは、次のようにすればよい。
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Yu
Mincho'
plt.plot([0, 10, 10, 0, 0], [0, 0, 5,
5, 0])
plt.text(2.5, 2.7, 'こんにちは!', fontsize = 30)
plt.show()
上のスクリプトでは、コード
plt.rcParams['font.family'] = 'Yu
Mincho'
によって、フォント「Yu Mincho」を指定している。
上のスクリプトを実行すると、下図のフォームが表示される。
なお、Pythonによるグラフ描画例は、以下のウェブサイトでも説明している。