専門ユニット2/山内研セミナー(2020/10/27)

関連サイトと資料

日本語フォント環境の準備

fontpropertiesを使いフォントを個別に設定する

日本語タイトルを出力するグラフ
%matplotlib inline
   
import numpy as np
from matplotlib import pyplot as plt
   
np.random.seed(0)
   
x = range(5)
y = 10 + 5 * np.random.randn(5)
   
fig = plt.figure()
ax = fig.add_subplot(111)
   
ax.set_title('日本語のタイトル')
ax.bar(x, y)
    



日本語フォントの利用
%matplotlib inline
   
import os
from pathlib import Path
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import font_manager
   
font_manager._rebuild()
      
font_path = 'C:\\Users\\admin\\AppData\\Local\\Microsoft\\Windows\\Fonts\\SourceHanCodeJP-Regular.otf'
font = font_manager.FontProperties(fname=font_path, size=14)
   
np.random.seed(0)
   
x = range(5)
y = 10 + 5 * np.random.randn(5)
   
fig = plt.figure()
ax = fig.add_subplot(111)
   
ax.set_title('日本語のタイトル', fontproperties=font)
ax.bar(x, y)
    



X軸のラベルで日本語フォントを利用する
%matplotlib inline
   
import os
from pathlib import Path
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import font_manager
   
font_manager._rebuild()
      
font_path = 'C:\\Users\\admin\\AppData\\Local\\Microsoft\\Windows\\Fonts\\SourceHanCodeJP-Regular.otf'
font = font_manager.FontProperties(fname=font_path, size=14)
   
np.random.seed(0)
   
x = range(5)
y = 10 + 5 * np.random.randn(5)
   
fig = plt.figure()
ax = fig.add_subplot(111)
   
ax.set_title('日本語のタイトル', fontproperties=font)
ax.set_xlabel('X軸', fontproperties=font)
ax.bar(x, y)
    


rcParamsを使いフォントを一括で設定する

rcParamsを利用したフォントの設定
%matplotlib inline
   
import os
from pathlib import Path
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import rcParams
   
rcParams['font.sans-serif'] = 'Source Han Code JP'
rcParams['font.weight'] = 'regular'
rcParams['axes.titlesize'] = 15
rcParams['ytick.labelsize'] = 12
rcParams['xtick.labelsize'] = 12
   
np.random.seed(0)
   
x = range(5)
y = 10 + 5 * np.random.randn(5)
   
fig = plt.figure()
ax = fig.add_subplot(111)
   
ax.set_title('日本語のタイトル')
ax.bar(x, y)
    


matplotlibrcで日本語フォントを設定する

現在参照されているmatplotlibrcの場所を確認
from matplotlib import matplotlib_fname
   
print('参照先は {0}'.format(matplotlib_fname()))
    



matplotlibrcをコピー
import shutil
from matplotlib import matplotlib_fname
   
shutil.copyfile(matplotlib_fname(), 'matplotlibrc')
    

フォントキャッシュのクリア
from matplotlib import font_manager
   
font_manager._rebuild()
    

日本語タイトルを出力するグラフ
%matplotlib inline
   
import numpy as np
from matplotlib import pyplot as plt
   
np.random.seed(0)
   
x = range(5)
y = 10 + 5 * np.random.randn(5)
   
fig = plt.figure()
ax = fig.add_subplot(111)
   
ax.set_title('日本語のタイトル')
ax.bar(x, y)
    


折れ線グラフの描画

サンプル3-1-1
%matplotlib inline
import matplotlib.pyplot as plt
    
plt.plot([1, 2, 3, 4], # xの値
         [1, 4, 9, 16])# yの値
plt.ylabel('y-label')  # y軸のラベルをプロット
plt.xlabel('x-label')  # x軸のラベルをプロット
plt.show()             # グラフを表示
    

サンプル3-1-2
%matplotlib inline
import matplotlib.pyplot as plt
   
plt.plot([1, 2, 3, 4],       # xの値
         [1, 4, 9, 16],      # yの値
         linestyle='dotted', # ラインを点線にする
         linewidth=5,        # ライン幅は5pt
         color='red'         # ラインの色は赤
        )
plt.ylabel('y-label')        # y軸のラベルをプロット
plt.xlabel('x-label')        # x軸のラベルをプロット
plt.show()                   # グラフを表示
    

サンプル3-1-3
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np             # NumPyをインポート
   
x=np.array([1, 2, 3, 4])       # xの値
y=np.array([1, 4, 9, 16])      # yの値
   
# ラベル用テキストを関連付けてラインをプロット
plt.plot(x, y, linestyle="solid", label='Normal')
plt.plot(x, y/2, linestyle="dashed", label='Divided by 2')
plt.plot(x, y/3, linestyle="dashdot", label='Divided by 3')
plt.plot(x, y/4, linestyle="dotted", label='Divided by 4')
plt.legend()                  # 凡例をロット
   
plt.show()                    # グラフを表示
    

軸のスケールを指定して散布図を描画する

サンプル3-3-1
%matplotlib inline
import matplotlib.pyplot as plt
   
plt.plot([1, 2, 3, 4],     # xの値
         [1, 4, 9, 16],    # yの値
         marker='o',       # マーカーの形状はサークル(円)
         linestyle='None') # ラインは非表示
   
plt.axis([0,               # x軸の最小値
          5,               # x軸の最大値
          0,               # y軸の最小値
          20])             # y軸の最大値
   
plt.show()
    

サンプル3-3-2
%matplotlib inline
import matplotlib.pyplot as plt
   
plt.plot([1, 2, 3, 4],           # xの値
         [1, 4, 9, 16],          # yの値
         marker='d',             # マーカーの形状はダイアモンド型
         markersize=16,          # マーカー全体のサイズ
         markerfacecolor='white',# マーカーの色は白
         markeredgewidth=4,      # マーカーエッジのサイズ
         markeredgecolor='red',  # マーカーエッジを赤にする
         linestyle='None')       # ライン非表示
   
plt.axis([0, 5, 0, 20])          # 軸のスケール
plt.show()
    

棒グラフの描画

サンプル3-4-1
%matplotlib inline
import matplotlib.pyplot as plt
   
y = [15, 30, 45, 10, 5]   # y値(バーの高さ)
x = [1, 2, 3, 4, 5]       # x軸上の並び順
label = [                 # 各バーのx軸上のラベル
    'Apple', 'Banana', 'Orange', 'Grape', 'Strawberry'
    ]
plt.bar(x=x,              # x値を設定
        height=y,         # バーの高さを設定
        tick_label=label) # 各バーのx軸上のラベルを設定
plt.title('Sales')        # タイトルをプロット
plt.xlabel('Fruit')       # x軸、y軸のラベルをプロット
plt.ylabel('amount of sales')
   
plt.show()
    

サンプル3-4-2
plt.bar(x=x,              # x値を設定
        height=y,         # バーの高さを設定
        tick_label=label, # 各バーのx軸上のラベルを設定
        width=1.0)        # バーの幅を1.0にして隙間をなくす
   
plt.show()
    

サンプル3-4-3
plt.bar(x=x,              # x値を設定
        height=y,         # バーの高さを設定
        tick_label=label, # 各バーのx軸上のラベルを設定
        color="pink",     # バーの色はピンク
        edgecolor='red',  # エッジラインの色はレッド
        linewidth=5)      # エッジラインの幅は5
   
plt.show()
    

サンプル3-4-4
err = [i * 0.08 for i in y] # エラー値
plt.bar(x=x,                # x軸
        height=y,           # バーの高さ
        tick_label=label,   # 各バーのx軸上のラベルを設定
        yerr=err,           # エラーバーを表示
        ecolor='black',     # エラーバーの色は黒
        capsize=5)          # キャップサイズは5
   
plt.show()
    

円グラフの描画

サンプル3-5-1
%matplotlib inline
import matplotlib.pyplot as plt
   
values = [100, 200, 300, 400, 500] # グラフ要素の値
labels = [                         # グラフ要素のラベル
    'Apple', 'Banana', 'Grape', 'Orange', 'Pineapple'
]
plt.pie(x=values,                  # グラフ要素の値を設定
        labels=labels,             # グラフ要素のラベルを設定
        autopct='%.2f%%')          # 構成割合として小数点以下2桁までをプロット
plt.axis('equal')                  # グラフを真円仁する
plt.show()
    

サンプル3-5-2
plt.pie(x=values,                  # グラフ要素の値を設定
        labels=labels,             # グラフ要素のラベルを設定
        autopct='%.2f%%',          # 構成割合として小数点以下2桁までをプロット
        startangle=90,             # 90度(真上)の位置から開始
        counterclock=False         # 時計回りにする
       )
plt.axis('equal')                  # グラフを真円仁する
plt.show()
    

サンプル3-5-3
# 要素のカラーを指定するリスト
setcolors = ['red', 'violet', 'fuchsia', 'deeppink', 'orange']
   
plt.pie(x=values,                  # グラフ要素の値を設定
        labels=labels,             # グラフ要素のラベルを設定
        colors=setcolors,          # グラフ要素のカラーを設定
        wedgeprops={
            'linewidth': 3,        # エッジラインの幅は3
            'edgecolor':'white'    # エッジラインの色はホワイト
        },
        labeldistance=0.5,         # ラベルを円周内の50%の位置に表示
        textprops={
            'color': 'white',      # ラベルテキストのカラーはホワイト
            'weight': 'bold'}      # 太字にする
       )
plt.axis('equal')                  # グラフを真円仁する
plt.show()
    

サンプル3-5-4
plt.pie(x=values,                  # グラフ要素の値を設定
        labels=labels,             # グラフ要素のラベルを設定
        autopct='%.2f%%',          # 構成割合として小数点以下2桁までをプロット
        colors=setcolors,          # グラフ要素のカラーを設定
        explode=[0.3, 0, 0, 0, 0]  # 1番目の要素の中心位置を円周上から0.3にする
       )
plt.axis('equal')                  # グラフを真円仁する
plt.show()
    

グラフを画像ファイルとして保存する

サンプル3-7-1
import numpy as np
import matplotlib        # matplotlibを先にインポート
matplotlib.use("Agg")    # AGGレンダラーを呼び出しておく
%matplotlib inline
import matplotlib.pyplot as plt
  
x=np.array([1, 2, 3, 4]) # xの値
y=np.array([1, 4, 9, 16])# yの値
# ラベル用テキストを関連付けてラインをプロット
plt.plot(x, y, linestyle="solid", label='Normal')
plt.plot(x, y/2, linestyle="dashed", label='Divided by 2')
plt.plot(x, y/3, linestyle="dashdot", label='Divided by 3')
plt.plot(x, y/4, linestyle="dotted", label='Divided by 4')
plt.legend()             # 凡例をロット
   
# PDFファイルに書き出す
plt.savefig('myfig.pdf')    
# 解像度を指定してPNGファイルに書き出す
plt.savefig('myfig.png', dpi=200) 
   
plt.show()               # グラフを表示(必要なければ省略)
    

複数のグラフを並べて表示する

サンプル4-7-1
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
   
t = np.arange(0.0, 2.0, 0.01)       # 0~2.0の範囲で0.01刻みの等差数列
s1 = np.sin(2*np.pi*t)              # (2・円周率・t)の正弦
s2 = np.sin(4*np.pi*t)              # (4・円周率・t)の正弦
   
plt.subplot(211, facecolor='pink')  # 2行×1列の上段を指定
plt.plot(t, s1)
plt.subplot(212, facecolor='white') # 2行×1列の下段を指定
plt.plot(t, s2)
plt.show()
    

サンプル4-7-2
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
  
t = np.arange(0.0, 2.0, 0.01)       # 0~2.0の範囲で0.01刻みの等差数列
s1 = np.sin(2*np.pi*t)              # (2・円周率・t)の正弦
s2 = np.sin(4*np.pi*t)              # (4・円周率・t)の正弦
  
plt.subplot(121, facecolor='pink')  # 1行×2列の左側を指定
plt.plot(t, s1)
plt.subplot(122, facecolor='white') # 1行×2列の右側を指定
plt.plot(t, s2)
plt.show()
    

サンプル4-7-3
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
  
t = np.arange(0.0, 2.0, 0.01)        # 0~2.0の範囲で0.01刻みの等差数列
s1 = np.sin(2*np.pi*t)               # (2・円周率・t)の正弦
s2 = np.sin(4*np.pi*t)               # (4・円周率・t)の正弦
s3 = np.sin(6*np.pi*t)               # (6・円周率・t)の正弦
s4 = np.sin(8*np.pi*t)               # (8・円周率・t)の正弦
  
plt.subplot(221, facecolor='pink')   # 2行×2列の第1行、第1列を指定
plt.plot(t, s1)
plt.subplot(222, facecolor='white')  # 2行×2列の第1行、第2列を指定
plt.plot(t, s2)
plt.subplot(223, facecolor='silver') # 2行×2列の第2行、第1列を指定
plt.plot(t, s3)
plt.subplot(224, facecolor='pink')   # 2行×2列の第2行、第2列を指定
plt.plot(t, s4)
plt.show()
    

グラフオブジェクトで操作する

サンプル4-10-1
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
   
x1 = np.linspace(0.0, 5.0)                # 0.0~5.0の等差数列(要素数50)
y1 = np.cos(2 * np.pi * x1) * np.exp(-x1) # x1の減衰振動のシミュレーション
x2 = np.linspace(0.0, 3.0)                # 0.0~2.0の等差数列(要素数50)
y2 = np.cos(2 * np.pi * x2) * np.exp(-x1) # x2の減衰振動のシミュレーション
    

サンプル4-10-2
fig = plt.figure()                   # Figureを生成
# 左上にx1、y1のラインをプロット
ax1 = fig.add_subplot(221)           # (221)にAxesを追加
ax1.plot(x1, y1)                     # ラインをプロット
ax1.set_title('scatter plot')        # タイトル
ax1.set_ylabel('Damped oscillation') # y軸のラベル
   
# 右上にx1、y1のマーカーをプロット
ax2 = fig.add_subplot(222)           # (222)にAxesを追加
ax2.scatter(x1, y1, marker='o')      # 散布図
ax2.set_title('scatter plot')        # タイトル
   
# 左下にx2、y2のラインをサブプロット
ax3 = fig.add_subplot(223)           # (223)にAxesを追加
ax3.plot(x2, y2)                     # ラインをプロット
ax3.set_xlabel('time (s)'),          # x軸のラベル
ax3.set_ylabel('Damped oscillation') # y軸のラベル
   
# 右下にx2、y2のマーカーをサブプロット
ax4 = fig.add_subplot(224)           # (224)にAxesを追加
ax4.scatter(x2, y2, marker='o')      # 散布図
ax4.set_xlabel('time (s)')           # x軸のラベル
   
plt.show()
    

サンプル4-10-3
# 左上にx1、y1のラインをサブプロット
ax1 = plt.subplot(221)               # (221)にAxesを生成
ax1.plot(x1, y1)                     # ラインをプロット
ax1.set_title('scatter plot')        # タイトル
ax1.set_ylabel('Damped oscillation') # y軸のラベル
   
# 右上にx1、y1のマーカーをサブプロット
ax2 = plt.subplot(222)               # (222)にAxesを生成
ax2.scatter(x1, y1, marker='o')      # 散布図
ax2.set_title('scatter plot')        # タイトル
   
# 左下にx2、y2のラインをサブプロット
ax3 = plt.subplot(223)               # (223)にAxesを生成
ax3.plot(x2, y2)                     # ラインをプロット
ax3.set_xlabel('time (s)'),          # x軸のラベル
ax3.set_ylabel('Damped oscillation') # y軸のラベル
   
# 右下にx2、y2のマーカーをサブプロット
ax4 = plt.subplot(224)              # (224)にAxesを生成
ax4.scatter(x2, y2, marker='o')     # 散布図
ax4.set_xlabel('time (s)')          # x軸のラベル
   
plt.show()
    

サンプル4-10-4
# 左上にx1、y1のラインをサブプロット
ax1 = plt.subplot(221)              # (221)にAxesを生成
plt.plot(x1, y1)                    # ラインをプロット
ax1.set(title='scatter plot',       # タイトル
        ylabel='Damped oscillation' # y軸のラベル
       )
    
# 右上にx1、y1のマーカーをサブプロット
ax2 = plt.subplot(222)              # (222)にAxesを生成
ax2.scatter(x1, y1)                 # 散布図
ax2.set(title='scatter plot')       # タイトル
   
# 左下にx2、y2のラインをサブプロット
ax3 = plt.subplot(223)              # (223)にAxesを生成
ax3.plot(x2, y2)                    # ラインをプロット
ax3.set(xlabel='time (s)',          # x軸のラベル
        ylabel='Damped oscillation' # y軸のラベル
       )
   
# 右下にx2、y2のマーカーをサブプロット
ax4 = plt.subplot(224)             # (224)にAxesを生成
ax4.scatter(x2, y2)                # 散布図
ax4.set(xlabel='time (s)')         # x軸のラベル
  
plt.show()
    

サブプロットを配列形式で操作する

サンプル4-11-1
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
   
x1 = np.linspace(0.0, 5.0)                # 0.0~5.0の等差数列(要素数50)
y1 = np.cos(2 * np.pi * x1) * np.exp(-x1) # x1の減衰振動のシミュレーション
x2 = np.linspace(0.0, 3.0)                # 0.0~2.0の等差数列(要素数50)
y2 = np.cos(2 * np.pi * x2) * np.exp(-x1) # x2の減衰振動のシミュレーション
    

サンプル4-11-2
# figにFigure、axに2×2のAxesを代入
fig, ax = plt.subplots(2, 2,             # 2×2のグリッド
                       figsize=(8, 6)    # 横6インチ、縦3インチにする
                       )
   
# 1行目の左エリアにライン、右エリアにマーカーをプロット
ax[0, 0].plot(x1, y1)                    # ラインをプロット
ax[0, 0].set(title='line plot',          # タイトル
             ylabel='Damped oscillation' # y軸ラベル
            )
ax[0, 1].scatter(x1, y1)                 # マーカーをプロット
ax[0, 1].set(title='scatter plot')       # タイトル
   
# 2行目の左エリアにライン、右エリアにマーカーをプロット
ax[1, 0].plot(x2, y2)                    # ラインをプロット
ax[1, 0].set(xlabel='time (s)',          # タイトル
             ylabel='Damped oscillation' # y軸ラベル
            )
ax[1, 1].scatter(x2, y2)                 # マーカーをプロット
ax[1, 1].set(xlabel='time (s)')          # x軸ラベル
   
plt.show()
    

サンプル4-11-3
# figにFigureを代入
# ax1に1行目の2つのAxes
# ax2に2行目の2つのAxes、
# ax3に3行目の2つのAxesを代入
fig, (ax1, ax2, ax3) = plt.subplots(3,2, figsize=(6, 6))
   
# 1行目の左エリアにライン、右エリアにマーカーをプロット
ax1[0].plot(x1, y1)                # solid line
ax1[0].set(title='line plot', ylabel='Damped oscillation')
ax1[1].scatter(x1, y1)             # circle
ax1[1].set(title='scatter plot')
   
# 2行目の左エリアにライン、右エリアにマーカーをプロット
ax2[0].plot(x2, y2,linestyle='--') # dashed line
ax2[0].set(xlabel='time (s)', ylabel='Damped oscillation')
ax2[1].scatter(x2, y2, marker='<') # triangle_left
ax2[1].set(xlabel='time (s)')      # x軸ラベル
   
# 3行目の左エリアにライン、右エリアにマーカーをプロット
ax3[0].plot(x2, y2, linestyle=':') # dotted line
ax3[0].set(xlabel='time (s)', ylabel='Damped oscillation')
ax3[1].scatter(x2, y2, marker='|') # vline
ax3[1].set(xlabel='time (s)')      # x軸ラベル
   
plt.show()