Home

拙著「Pythonでデータ分析」の第2章「グラフ描画」の補足説明と更新

 

ライブラリmatplotlibを用いてグラフ描画を行うとき、日本語も使用できる。ライブラリjapanize_matplotlibを用いる方法とmatplotlibfont 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を指定する場合

 

使用フォントを選ぶときは、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によるグラフ描画例は、以下のウェブサイトでも説明している。

ウェブサイトー1ウェブサイトー2ウェブサイトー3

 

 

Home