Matplotlibで散布図を描いてみよう
scatterを使った散布図の作成(2D、3D)
PythonでMatplotlibを使ったグラフ作成練習その2をやるよ。ナノネ、前回の『グラフの作るためのキホン』はマスターした?
たぶん大丈夫かも...。
今回は散布図の作り方を練習するよ。
散布図は前回のキホン練習でも少し描いたけど?
うん、散布図はよく利用するからね~。繰り返し練習しておこう。
ラジャー。とりあえず、いつものインポートを実行しておく。
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
# ********************************
# 動作テスト環境 @2019/05
# ********************************
# Google Colaboratory
# Ubuntu 18.04.2 LTS
# Python 3.6.7
# :: matplotlib 3.0.3
# :: numpy 1.16.3
# :: scikit-learn 0.20.3
使うはデータは毎回同じだけど、練習用定番のIrisで。
みんな大好き?Irisのデータを準備して...
from sklearn import datasets
iris = datasets.load_iris()
print(iris.data.shape) # データ 150x4(がく片長さ、がく片幅、花弁長さ、花弁幅)
print(iris.feature_names) # sepal length, sepal width, petal length, petal width
print(iris.target.shape) # アヤメ品種(0=setosa、1=versicolor、2=virginica)
print(iris.target_names)
plot()でエィ!
plt.plot(iris.data)
plt.show()
??...そりゃぁ!
plt.plot(iris.data, 'o')
plt.show()
適当にplot()を実行したらカラフルなグラフが出力されたけど...作りたいイメージとは違うなぁ><
データの変数が4種類(sepal length、sepal width、petal length、petal width)あるから、とりあえず2変数に絞ってグラフを作ってみて。
1番目(sepal length)と2番目(sepal width)のデータを使うことにする。
x = iris.data[:, 0]
y = iris.data[:, 1]
plt.plot(x, y, 'o')
plt.title('Iris', size=16)
plt.xlabel(iris.feature_names[0], size=12)
plt.ylabel(iris.feature_names[1], size=12)
plt.show()
今度はうまくできたかも。
散布図は、plot()からも作れるんだけど、scatter()を使ったコードの書き方も覚えておいてね。
scatter()で散布図を作成しよう¶
scatter()の使い方は、こんな感じ。
plt.scatter(x, y)
plt.show()
さっきと同じグラフができた。
便利なおまかせplot()で作られる散布図の実体は、scatter()が呼び出されているみたいだよ。
OK、散布図はscatter()ね。
次はアヤメの種類でマーカーの色分けをやってみよう。sacatter()を書き連ねて、ダラダラッ~てコードを書くとこんな感じ。
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111)
# setosa
ax.scatter(x=iris.data[iris.target==0, 0],
y=iris.data[iris.target==0, 1],
label=iris.target_names[0],
marker='o',
c='blue')
# versicolor
ax.scatter(x=iris.data[iris.target==1, 0],
y=iris.data[iris.target==1, 1],
label=iris.target_names[1],
marker='^',
c='red')
# virginica
ax.scatter(x=iris.data[iris.target==2, 0],
y=iris.data[iris.target==2, 1],
label=iris.target_names[2],
marker='s',
c='green')
ax.legend(loc='best', fontsize=14)
ax.set_title('Iris SepalLength / SepalWidth', size=16)
ax.set_xlabel(iris.feature_names[0], size=14)
ax.set_ylabel(iris.feature_names[1], size=14)
plt.show()
ダラダラのコードだけど、うまく色分けできたね。
さらにダラダラコードをループ処理にすると、こんな感じかな。
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111)
markers = ['o', '^', 's']
colors = ['blue', 'red', 'green']
for i, label in enumerate(iris.target_names):
ax.scatter(x=iris.data[iris.target==i, 0],
y=iris.data[iris.target==i, 1],
label=iris.target_names[i],
marker=markers[i],
c=colors[i])
ax.legend(loc='best', fontsize=14)
ax.set_title('Iris SepalLength / SepalWidth', size=16)
ax.set_xlabel(iris.feature_names[0], size=14)
ax.set_ylabel(iris.feature_names[1], size=14)
plt.show()
少しだけコードが短くなったかも。
実際にはラッパー関数を使ったり、もっと効率的に描く方法もあるんだけど。基礎練習なのでいろいろなパターンを試しておくのも、勉強になるよ(たぶん)。
ところで、三次元の散布図とかもみたことがあるけど、簡単に描けるの?
うん、三次元の散布図も簡単に描けるから実際にやってみよう。
三次元の散布図を作ってみよう(簡単な3Dグラフ)¶
三次元の散布図を作るにはmpl_toolkitsというパッケージを使うよ(matplotlibと一緒にインストールされる?)。
from mpl_toolkits.mplot3d import Axes3D
y = iris.target
fig = plt.figure(figsize=(12, 12))
ax = fig.add_subplot(111, projection='3d') # ※1 三次元プロットを指定
markers = ['o', '^', 's']
colors = ['blue', 'red', 'green']
for i, label in enumerate(iris.target_names):
ax.scatter(xs=iris.data[iris.target==i, 0], # x軸データ
ys=iris.data[iris.target==i, 1], # y軸データ
zs=iris.data[iris.target==i, 2], # z軸データ
label=iris.target_names[i],
marker=markers[i],
s=100,
c=colors[i])
ax.legend(loc='best', fontsize=14)
ax.set_title('Iris', size=16)
ax.set_xlabel(iris.feature_names[0], size=14)
ax.set_ylabel(iris.feature_names[1], size=14)
ax.set_zlabel(iris.feature_names[2], size=14)
plt.show()
2次元散布図のコードを少し書き換えるだけど、3Dグラフが作れるんだね!
ポイントはaxesオブジェクトを追加するところで、projection='3d'を指定してね(※1箇所)。それからscattter()でx,y,z軸のデータを引数で渡せば、キホン的には2次元散布図を作るのと大差ないよ。(詳しい設定や別の作成方法などは、ドキュメントを調べてみてね)
今回の散布図を描く練習は以上で。またね!
お疲れさまでした。またね!
0 件のコメント :
コメントを投稿