matplotlib で散布図を描く

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

コメント

タイトルとURLをコピーしました