Python/Matplotlibでグラフを描いてみよう02(scatterで散布図を作成)

Python/Matplotlibでグラフを描いてみよう02(scatterで散布図を作成)

Matplotlibで散布図を描いてみよう




scatterを使った散布図の作成(2D、3D)

PythonでMatplotlibを使ったグラフ作成練習その2をやるよ。ナノネ、前回の『グラフの作るためのキホン』はマスターした?

たぶん大丈夫かも...。

今回は散布図の作り方を練習するよ。

散布図は前回のキホン練習でも少し描いたけど?

うん、散布図はよく利用するからね~。繰り返し練習しておこう。

ラジャー。とりあえず、いつものインポートを実行しておく。

In [0]:
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
In [0]:
# ********************************
# 動作テスト環境 @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のデータを準備して...

In [3]:
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)
(150, 4)
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
(150,)
['setosa' 'versicolor' 'virginica']

plot()でエィ!

In [4]:
plt.plot(iris.data)
plt.show()

??...そりゃぁ!

In [5]:
plt.plot(iris.data, 'o')
plt.show()

適当にplot()を実行したらカラフルなグラフが出力されたけど...作りたいイメージとは違うなぁ><

データの変数が4種類(sepal length、sepal width、petal length、petal width)あるから、とりあえず2変数に絞ってグラフを作ってみて。

1番目(sepal length)と2番目(sepal width)のデータを使うことにする。

In [6]:
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()の使い方は、こんな感じ。

In [7]:
plt.scatter(x, y)
plt.show()

さっきと同じグラフができた。

便利なおまかせplot()で作られる散布図の実体は、scatter()が呼び出されているみたいだよ。

OK、散布図はscatter()ね。

次はアヤメの種類でマーカーの色分けをやってみよう。sacatter()を書き連ねて、ダラダラッ~てコードを書くとこんな感じ。

In [8]:
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()

ダラダラのコードだけど、うまく色分けできたね。

さらにダラダラコードをループ処理にすると、こんな感じかな。

In [9]:
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と一緒にインストールされる?)。

In [11]:
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 件のコメント :

コメントを投稿