matplotlib で散布図を描くには、scatter を使う。点を線でつなぐには、plot を使う。
アウトプット
今回作るグラフは下記。
準備
import
matplotlib の pyplot を plt としてインポートする。numpy も使う。日本語を使うので、rcParams もインポートし、設定する。
import matplotlib.pyplot as plt
import numpy as np
# 日本語フォント用
from matplotlib import rcParams
rcParams['font.sans-serif'] = ['Noto Sans CJK JP']
ウィンドウの作成
今回複数のグラフを作るので、ウィンドウを作成しておく。
# ウィンドウの作成
fig = plt.figure(figsize=(8,12))
データの準備
表示対象のデータを準備する。実数の入った1次元のリストなら表示できる。
今回、中身の数字は適当に作る。x1のようにリストに直打ちしても、y1のようにrange関数を使っても、x2,y2のように乱数を使っても、x,y,zのようにfor文でappendしても良い。
# 表示対象
x1 = [0,1,2,3,4,5,9,11.5,13,16,19,20,21,26,23];
y1 = list(range(0,30,2)) #[0,2,4,・・・28]
x2 = np.random.randn(15)*5;
y2 = (np.random.randn(15)*10).cumsum()
x = []; y = []; z = [];
for i in range(15):
x.append(i)
y.append(i + y2[i])
z.append(x[i]*y[i])
散布図
scatter
x, y の2項目の関係だけを見たい場合(例えば身長と体重の関係)は、scatter(x , y) とすると散布図を作れる。
# scatter を使う
ax1 = fig.add_subplot(3, 2, 1)
ax1.set_title('scatter を使う')
ax1.scatter(x1, y1, color='k')
plt.show()
plot
x, y の2項目に順番が付随している場合(どの順番でどこ(x, y)に行ったか)だと、plot を使い線で結ぶ。
# plot を使う
ax2 = fig.add_subplot(3, 2, 2)
ax2.set_title('plot を使う')
ax2.plot(x2, y2, color='k', linestyle='-')
plt.show()
点と点を線でつなぐ
点と点を線でつなぐには、plot の linestyle=’solid’ のオプションを使う方法と、scatter と plot を同じ subplot に用いる方法がある。
今回のアウトプットはどちらの方法でも違いが無い。ただ、scatter と plot とで使えるオプションが異なるため、どちらかの方法を選択する局面がありそうだ。
# 点をつなぐ(plot の linestyle="solid")
ax3 = fig.add_subplot(3, 2, 3)
ax3.set_title('plot の linestyle="solid"')
ax3.scatter(x, y, color='k')
ax3.plot(x, y, color='k', linestyle='solid')
plt.show()
# 点をつなぐ(scatterとplot)
ax4 = fig.add_subplot(3, 2, 4)
ax4.set_title('scatter と plot で点をつなぐ')
ax4.scatter(x, y, color='k')
ax4.plot(x, y, color='k', linestyle='-')
plt.show()
カラーマップ
scatter はカラーマップを扱える。カラーマップでは3次元データを、横軸、縦軸、色を使って視覚化する。
# カラーマップ
ax5 = fig.add_subplot(3, 2, 5)
ax5.set_title('カラーマップ')
cm = plt.cm.get_cmap('jet') # カラーマップを生成
sp = ax5.scatter(x, y, c=z, cmap=cm)
fig.colorbar(sp)
plt.show()
装飾
軸を装飾する。
.set_title(‘タイトル’) でタイトルをつける。横軸ラベル、縦軸ラベルはそれぞれ、.set_xlabel(“横軸ラベル”) 、.set_ylabel(“縦軸ラベル”) でつける。
グリッド先は、.grid() でつける。y軸を対数で表示するには、.set_yscale(‘log’) とする。
# 装飾系
ax6 = fig.add_subplot(3, 2, 6)
ax6.set_title('装飾')
ax6.scatter(x, y, color='k')
ax6.set_xlabel("横軸ラベル")
ax6.set_ylabel("縦軸ラベル")
ax6.set_yscale('log')
ax6.grid()
plt.show()
コード全文
コードの全文を下記に載せる。
import matplotlib.pyplot as plt
import numpy as np
# 日本語フォント用
from matplotlib import rcParams
rcParams['font.sans-serif'] = ['Noto Sans CJK JP']
# ウィンドウの作成
fig = plt.figure(figsize=(8,12))
# 表示対象
x1 = [0,1,2,3,4,5,9,11.5,13,16,19,20,21,26,23];
y1 = list(range(0,30,2)) #[0,2,4,・・・28]
x2 = np.random.randn(15)*5;
y2 = (np.random.randn(15)*10).cumsum()
x = []; y = []; z = [];
for i in range(15):
x.append(i)
y.append(i + y2[i])
z.append(x[i]*y[i])
# scatter を使う
ax1 = fig.add_subplot(3, 2, 1)
ax1.set_title('scatter を使う')
ax1.scatter(x1, y1, color='k')
# plot を使う
ax2 = fig.add_subplot(3, 2, 2)
ax2.set_title('plot を使う')
ax2.plot(x2, y2, color='k', linestyle='-')
# 点をつなぐ(plot の linestyle="solid")
ax3 = fig.add_subplot(3, 2, 3)
ax3.set_title('plot の linestyle="solid"')
ax3.scatter(x, y, color='k')
ax3.plot(x, y, color='k', linestyle='solid')
# 点をつなぐ(scatterとplot)
ax4 = fig.add_subplot(3, 2, 4)
ax4.set_title('scatter と plot で点をつなぐ')
ax4.scatter(x, y, color='k')
ax4.plot(x, y, color='k', linestyle='-')
# カラーマップ
ax5 = fig.add_subplot(3, 2, 5)
ax5.set_title('カラーマップ')
cm = plt.cm.get_cmap('jet') # カラーマップを生成
sp = ax5.scatter(x, y, c=z, cmap=cm)
fig.colorbar(sp)
# 装飾系
ax6 = fig.add_subplot(3, 2, 6)
ax6.set_title('装飾')
ax6.scatter(x, y, color='k')
ax6.set_xlabel("横軸ラベル")
ax6.set_ylabel("縦軸ラベル")
ax6.set_yscale('log')
ax6.grid()
# サブプロットの間のスペースを調整
plt.subplots_adjust(wspace=0.5, hspace=0.3)
# 表示
plt.show()
コメント