Matplotlibによるグラフ作成 第5回
PythonのMatplotlibを使用した基本的なグラフ作成方法を紹介する
今回は、テキスト
や線
などグラフの修飾方法を紹介する
また、複数のグラフや軸の取り扱い方法も紹介する
サンプルデータ生成
1次関数と2次関数の分布を用意する
import matplotlib.pyplot as plt import numpy as np data_x = [] data_y1 = [] data_y2 = [] for i in range(-10, 11): data_x += [i] data_y1 += [i * 5 + 20 + np.random.normal(0, 5)] data_y2 += [i**2 + np.random.normal(0, 5)]
テキスト挿入
ax.text でグラフ上の指定座標にテキストを挿入できる
グラフ内の表示位置を相対的に固定する場合は、transformを指定する
さらに、figure上にテキストを挿入する場合は fig.text を使用する
fig = plt.figure(figsize=(6, 5)) ax = fig.add_subplot(111) ax.scatter(data_x, data_y1) ax.scatter(data_x, data_y2) ax.set_title('Scatter') ax.set_xlabel('$x$') ax.set_ylabel('$y$') ax.text(5.0, 80, 'ax text normal') ax.text(0.1, 0.1, 'ax text transform', transform=ax.transAxes) fig.text(0.1, 0.9, 'fig text') ax.grid() fig.tight_layout()
線の挿入
線を描く場合は、axvline(縦線), axhline(横線) を使用する
範囲を描く場合は、 axvspan(縦帯), axhspan(横帯) を使用する
fig = plt.figure(figsize=(6, 5)) ax = fig.add_subplot(111) ax.scatter(data_x, data_y1) ax.scatter(data_x, data_y2) ax.axvline(x=5, color='r') ax.axhline(y=60, color='b') ax.axvspan(-8, -5, color='g', alpha=0.3) ax.axhspan(-20, -5, color='y', alpha=0.5) ax.grid() fig.tight_layout()
複数グラフ
add_subplot を使うことで、figure中に複数のグラフを描くことができる
また、sharex,sharey を指定することで、xy軸を共有することができる
fig = plt.figure(figsize=(6, 5)) ax = fig.add_subplot(2, 2, 1) ax.scatter(data_x, data_y1) ax.set_title('No.1') ax.set_xlim(-20, 20) ax.set_ylim(-10, 10) ax.grid() ax = fig.add_subplot(2, 2, 4, sharey=ax) ax.scatter(data_x, data_y2) ax.set_title('No.4') ax.set_xlim(-10, 10) ax.set_ylim(-50, 120) ax.grid() fig.tight_layout()
軸の追加
ax.twinx(), ax.twiny() グラフ内に x or y 軸を共有したグラフを作成することができる
fig = plt.figure(figsize=(6, 5)) ax = fig.add_subplot(111) p1 = ax.scatter(data_x, data_y1, color='r', marker='*') ax.set_xlabel('$x$') ax.set_ylabel('$y_1$') ax.set_xlim(-20, 20) ax.set_ylim(-50, 50) ax.grid() ax = ax.twinx() p2 = ax.scatter(data_x, data_y2, color='b', marker='o') ax.set_ylabel('$y_2$') ax.set_xlim(-10, 10) ax.set_ylim(-50, 120) ax.tick_params(axis='y', colors='b') ax.spines['right'].set_position(('outward', 20)) ax.legend([p1, p2], ['A', 'B']) fig.tight_layout()