サイトマップ

Matplotlibによるグラフ作成 第5回

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()