matplotlib.pyplot.axes – 任意位置へのグラフの配置

グラフを任意の位置に任意のサイズで表示する手順。

pyplot.axes(rect)

ここでrect = [left, bottom, width, height]で指定し、left, bottmはグラフの左下隅の位置、width, heightはグラフのサイズ。それぞれの値は、figureの範囲を0, 1とした場合の相対値。

matplotlib.pyplot – axesとsubplotによる複数グラフの表示

概要

1つのfigureの中に複数のaxesを表示する方法には、add_subplot()メソッド、subplots()メソッドの2通りがある。

add_subplot()による方法

Figure.add_subplot()は既存のfigureオブジェクトにsubplotを追加してAxesオブジェクトを生成する。

add_subplot()
figureに1つのAxesオブジェクトを生成
add_subplot(pos)
posは行数・列数・位置を表す3桁の整数。例えば234なら、2行3列のうち4番目の図。各数は当然10未満でなければならない。
add_subplot(nrows, ncols, index)
上記のposを分解して指定。行数・列数が多いときに使える。

subplots()による方法

Figure.subplots()は行数と列数を指定して各位置のaxesを配列として一度に生成する。

subplots(nrows=1, ncols=1, figsize=(6.4, 4.8))
nrowsncolssubplotの行数・列数。

戻り値はaxesの配列だが、行数・列数によって配列の次元が違ってくるので注意。

行数・列数とも1の場合(あるいはnrows、ncolsを省略した場合) Axesオブジェクトが1つ生成される。
行数・列数のいずれかが1の場合 1次元のAxesオブジェクトの配列が生成される。
行数・列数とも1より大きい場合 nrows×ncolsのサイズで2次元のAxesオブジェクトの配列が生成される。

行や列のぶち抜きグラフを描きたいとき

以下のようなグラフを描きたいときの方法はこちら

subplotの間隔や位置調整

figure内にsubplotで配置されたグラフの間隔やマージンを調整するにはsubplots_adjust()メソッドを用いる。

詳細な使い方はこちらを参照。

 

matplotlib.pyplot – axesによる表示(グラフエリアの表示要素)

概要

pyplotでグラフを描画する場合、pyplotのメソッドであるplotxlimを使うのが簡易だが、figureオブジェクトの下にaxesオブジェクトを生成して操作する方法がある。ここではaxesオブジェクトによる方法を整理してみた。

各メソッドの説明

axesオブジェクトの生成

ax = fig.add_subplot(arg)

figureオブジェクトからaxesオブジェクトを生成する。subplot()の引数argの指定方法には2通りある

なお、figureオブジェクトに属するaxesオブジェクトが1つの場合は以下のような指定もできる。

fig, ax = plt.subplots()

以後、グラフの描画やグラフエリアに対する表示オプションの設定は、得られたaxesオブジェクトのメソッドで行う。

グラフタイトル

axes.set_title(label[, loc])

文字列labelをグラフ上部に表示する。表示位置はloc="left"/"center"/"right"で指定(デフォルトは"center")

軸の設定

軸ラベル

axes.set_xlabel(label)
axes.set_ylabel(label)

文字列labelをx軸/y軸のラベルとして設定する。

set_xlabel()/set_ylabel()~軸のラベル

軸のスケール

axes.set_xscale(scale)
axes.set_yscale(scale)

軸のスケールを設定する。スケールの種類は以下の通り。

  • 'linear':通常の線形軸
  • 'log':対数軸
  • 'symlog':負の領域も含めた対数軸(−log (−x) for x < 0)
  • 'logit':?

軸の範囲

axes.set_xlim(left, right)
axes.set_ylim(bottom, top)

x軸・y軸の上限・下限を設定する。引数指定の変化などはpyplotのメソッドと同様

軸目盛の設定

axes.set_xticks(ticks)
axes.set_yticks(ticks)

ticksのリスト等の要素で軸目盛を設定する。軸目盛のラベルを変更したい場合は、ticksと同じ要素数のlabelsで以下を実行する。

axes.set_xticklabels(labels)
axes.set_yticklabels(labels)

なお、軸のラベルを非表示にしたいときは、以下のように指定する。

軸目盛を非表示にしたいときは以下を指定。

軸の調整

  • 軸の表示位置はspines()で指定する
  • 複数グラフの外側だけに軸ラベル・目盛ラベルを表示するには、各AxesオブジェクトについてAxes.label_outer()を実行する

凡例

pyplot.legend(loc=location)

データに設定されたラベルで、locationで指定した位置に凡例を表示する。locationの指定方法はpyplot.legendと同じ

詳細はpyplot – legendを参照。

格子

pyplot.grid(True/False)

Trueを指定すると、軸目盛に対応した格子が描かれる。

水平線・垂直線

axes.hlines([y, xmin, xmax, colors='k', linestyles='solid', label='']
axes.vlines([x, ymin, ymax, colors='k', linestyles='solid', label='']

指定した位置に水平線・垂直線を描く。引数の指定方法はpyplot.legendと同じ

テキスト

axes.text(x, y, str, size=size, color=color)

指定した位置にstrを表示させる。

参考サイト

pyplotpltを使う方法、axesaxを使う方法などがネット上にもそれぞれ存在していたが、以下の記事がたいへん参考になった。感謝したい。

早く知っておきたかったmatplotlibの基礎知識・・・

 

 

matplotlib.pyplot – figure~複数の図の描画

概要

pyplot.figure()は、実行のたびに新たなfigureオブジェクトを生成する。コンソールからの実行環境下では、各figureオブジェクトは別々のウィンドウとして表示され、それぞれにファイルへの保存が可能。

以下の例では、2つのfigureオブジェクトを生成し、それぞれにグラフをプロットし、それらをファイルに保存している。

figureで生成される図のサイズはfigsize=(width, height)で指定し、width, heightはインチ単位で指定する。省略した場合のデフォルトサイズは、6.4in×4.8in。

なお、figureオブジェクトを生成してグラフを描画する場合、直接figureに対してではなく、その中にaxesオブジェクトを追加して操作するのが通常。

matplotlib_pyplot_fig_1.png

matplotlib_pyplot_fig_2

 

matplotlib.pyplot – subplotによる複数グラフの描画

概要

pyplot.subplot()によって、一つのウィンドウに複数のグラフを描画できる。

subplot(rows, cols, positon)
subplot(rcp)

rowsでグラフの行数、colsで列数を指定。positionはrows*colsの中での描画位置を1つの数値で指定し、1行1列目→1行2列目→・・・→2行1列目→2行2列目の順番に1から1つずつ増えていく。

ここで引数指定に2つの方法があって、rows, col, positionをそれぞれ1つの数値として指定する方法と、rcpの形で1つの数値として指定する方法がある。たとえば2行3列のグラフエリアの2行2列目を指定する場合は(2, 3, 5)(235)となる。

以下の例は、2×2のグラフを描画する例。

 

matplotlib.pyplot – グラフエリアの表示要素

概要

pyplotで直接グラフを描画する際の基本的なオプションの例示。

各オプションの説明

グラフタイトル

pyplot.tytle(label[, loc])

文字列labelをグラフ上部に表示する。表示位置はloc="left"/"center"/"right"で指定(デフォルトは"center")

軸ラベル

pyplot.xlabel(label)
pyplot.ylabel(label)

文字列labelをx軸/y軸のラベルとして表示する。

軸の範囲

pyplot.xlim(left, right)
pyplot.ylim(bottom, top)

x軸・y軸の上限・下限を設定する。設定は2つの変数で与えるか、以下のようにタプルで与えてもよい。

pyplot.xlim((left, right))

また、上下限のいずれか1つの値を指定し、他方の値を保持したまま値の変更が可能。

pyplot.xlim(right=1)
pyplot.ylim(bottom=-1)

引数なしで実行すると、上限・下限の値がタプルで返される。

left, right = pyplot.xlim()

軸目盛の設定

pyplot.xticks(ticks[, labels])
pyplot.yticks(ticks[, labels])

リストなどで与えた値を軸目盛とする。labelsticksと同じ要素数で与えると、その内容が軸目盛のラベルに置き換えられる。

凡例の表示

pyplot.legend(loc=location)

データに設定されたラベルで、locationで指定した位置に凡例を表示する。

locationは文字列か整数のコードで以下のように指定。

location string location code
‘best’ 0
‘upper right’ 1
‘upper left’ 2
‘lower left’ 3
‘lower right’ 4
‘right’ 5
‘center left’ 6
‘center right’ 7
‘lower center’ 8
‘upper center’ 9
‘center’ 10

格子の表示

pyplot.grid(True/False)

Trueを指定すると、軸目盛に対応した格子が描かれる。

水平線・垂直線の表示

pyplot.hlines([y, xmin, xmax, colors='k', linestyles='solid', label='']
pyplot.vlines([x, ymin, ymax, colors='k', linestyles='solid', label='']

たとえばhlinesの場合、水平線を引くyの値をリスト等で与え、xminxmaxの間に線を描く。colorsは線の色、linestylesは線のスタイルで'solid', 'dashed', 'dashdot', 'dotted'のいずれか。

colorslinestylesは、1つ指定した場合は全ての水平線/垂直線に適用されるほか、yの要素数にあわせて個別に指定することもできる。

colorscolorlinestyleslinestyleと単数形で指定しても実行される。

 

 

Python3 – KMeansClustering

概要

k平均法(k-means clustering)はクラスタリングの手法の1つで、与えられたデータ群の特徴と初期値に基づいて、データを並列(非階層)のクラスターに分類する。

アルゴリズムはシンプルで、以下の手順。

  1. クラスターの数だけクラスターの代表点の初期値を設定する
  2. 代表点の位置が収束するまで以下を繰り返す
    1. データの各点から最も近い代表点を選ぶ
    2. 同じ代表点の点群から重心を算出し、新しい代表点の位置とする

このクラスは、特徴量が2つのデータ群と代表点の初期値を与えて、k平均法でクラスタリングを行うテストクラス。

2つの特徴量x_datay_dataを与えてオブジェクトを生成し、代表点の初期値x_meansy_meansを与えてメソッドを実行して結果を得る。

全コード

KMeansClusteringクラスの全コードは以下の通り。

利用方法

クラスタリングを行うインスタンスの生成

初期データを与え、KMeansClusteringクラスのインスタンスを生成する。

コンストラクターに与える引数は以下の通り。

x_data, y_data
クラスタリングを行うデータの特徴量x、yの配列(1次元のndarray)。

クラスタリングの実行

生成したインスタンスに対して、クラスタリングを行うメソッドを実行して結果を得る。

メソッドに与える引数は以下の通り。

x_means, y_means
k個のクラスターの代表点の初期値(1次元のndarray)。

結果は以下のタプルで与えられる。

x_means, y_means
クラスターの代表点のx、yの配列。収束までの各計算段階の値を記録しており、2次元のndarrayの各行が各計算ステップに相当。
groups
各データが属するクラスター(代表点)番号のndarray

実行例

以下のコードでKMeansClusteringクラスをテスト。内容は以下の通り。

  1. 2つの円状に散らばるランダムな点群を発生させ、1つのデータとしてまとめる
    • random_scatter_dataは指定した中心・半径の円内に指定した数のランダムな点を発生させるモジュールで、別途作成(最後の方にコードを掲載)
  2. クラスターの代表点の数と位置、散布図を描画するパラメーターを設定する
    • プロットする図の数は2行3列で固定し、初期状態を除いた5つの図を表示させる
    • 予め実行させてコンソールで収束回数を確認し、33行目で表示させる計算ステップを指定している
  3. 初期状態の散布図をプロット
  4. クラスタリングを行うKMeansClustringオブジェクトを生成し、結果を得るためのメソッドを実行(53-54行目)
  5. 結果をプロット

このコードの実行結果はコンソールで以下のように表示される。

この結果から1、2、3、5、7回目の計算結果を図示するよう上のコードでセットした表示結果は以下の通り。

グループが比較的明確なので、早い段階で代表点の位置が定まっている。

クラス説明

__init__()~インスタンス生成

クラスタリングを行うデータの特徴量x_datay_datandarrayで与えてインスタンスを生成。

プライベート・メンバーは以下の通り。

_x, _y
クラスタリングを行うデータの2つの特徴量の配列。計算過程で変更されない。
_x_means, _y_means
代表点の計算結果を保存していく配列。分析実行時に初期値が与えられるため、初期値はNone。
_num_data
データの個数。
_num_means
代表点(クラスターの個数)。代表点が分析実行時に与えられるため、初期値は0。
_groups
各データの属するクラスターを保存していく配列。

get_result()~分析の実行

k個の代表点のx、yを引数として渡し、結果を得る。

引数

_x_means, _y_means
k個の代表点の初期値x、yを、それぞれ1次元のndarrayで与える。引数で与えた配列は変更されない。

戻り値

x_means, y_means
代表点の計算結果が保存された配列。各行は計算ステップに相当。
groups
各計算ステップにおける、各点のクラスターが保存された配列。各行は計算ステップに相当。

処理内容

  1. 代表点の初期値をプライベート・メンバーにコピーし、代表点の個数をセット
  2. 全ての代表点の位置が収束するまで、以下を繰り返す
    1. 各データについて、最も近い代表点をセット
    2. 共通の代表点を持つデータから、新しい代表点の位置を計算
    3. 代表点の前回最後の計算値と今回の計算値が収束したならループ終了、でなければ計算結果を追加してループ継続
  3. 計算結果を戻り値として終了

プライベートメソッド

_distance()~2点間の距離

2つの点の距離を与える。ここではユークリッド距離の2乗。

_point_converged()~収束判定

2つの点の座標から、点の位置が収束したかどうかを判定。

本来、各座標値はfloatなので'=='による判定は危険だが、ここでは収束の速さと確実性を信じて簡易に設定。

_all_points_converged()~全ての点の収束判定

配列で与えた2組の点がすべて収束条件を満たしているか判定。

_set_nearest_mean_point()~各点に最も近い代表点

処理内容

  1. 各データについて、それぞれから最も近い距離にある代表点を探し、その番号を1次元の配列groupsに記録
  2. _groups配列に、今回の分類結果を行として追加

_revise_mean_points()~代表点の更新

同じ代表点に属するデータからそれらの重心を計算し、新しい代表点として返す。

random_scatter_data.py

今回整理のためにつくったモジュールで、内容は以下の通り。

 

matplotlib.pyplot – グラフ

グラフの描画

pyplot

figure, axes

グラフの種類

3次元グラフ

tips

 

matplotlib.pyplot – 基本的なグラフの描画方法

概要

pyplotのみを使った基本的なグラフの描画方法。一般的にはmatplotlib.pyplotpltというエイリアスでインポートする。

この例では、pyplotの関数のみを用いて1つのグラフに2つの曲線を描画し、タイトルや軸ラベル、凡例などを追加している。

また、軸目盛の間隔を設定したり、グリッドを描かせたりしている。

実行結果は以下の通り。

ライブラリーのインポート

グラフ描画のためのパッケージ、matplotlob.pyplotpltとしてインポートしている。また、関数描画のためにnumpynpとしてインポート。

描画する関数

ここではpyplotplot()で描画するため、2つの三角関数を準備している。

xの値は共通で、numpy.linspace()で−π~+πの間で等間隔にデフォルトの50個の点を準備。endpoint=Trueで終端の点も含めている。

そのxの値に対して、sin、cosの関数の値をy1y2に保存。numpy.linspace()から得られるxや、それに対してNumpyのユニバーサル関数で計算されるy1y2ndarray

各種設定

タイトルと軸ラベル

pyplot.title()の引数でグラフのタイトル、pyplot.xlabel()pyplot.ylabel()の引数でx軸とy軸のラベルを設定している。

軸の範囲

pyplot.xlim()pyplot.ylim()で、それぞれの軸の下限値と上限値を設定している。x軸については−π~+πとしている。

軸目盛

pyplot.xticks()pyplot.yticks()の引数で、軸目盛に表示する値を設定している。引数は、表示させたい軸の値をリストとして与える。

x軸については−π、−π/2、0、π/2、πの値を直接与え、y軸についてはnumpy.linspace()関数で、-1~+1の間で等間隔な5点(-1、-0.5、0、0.5、1)を計算している。

グリッド(補助線)

グラフの描画エリア内に、軸目盛に対応した細い補助線を描くため、pyplot.grid()の引数をTrueで指定している。

グラフの描画

pyplot.plot()の引数にxy1及びy2を指定してグラフを描いている。2つのplot()関数を書くことで、関数は重なって描かれる。

それぞれのグラフに対してlabel引数を指定していて、それらは凡例表示に使われる。

凡例の表示

pyplot.legend()で凡例を設定している。

凡例にはpyplot.plot()で指定したラベルが使われるため、pyplot.legend()pyplot.plot()の後に書かなければならない。

また、凡例の表示位置をloc引数で指定していて、この場合は左上に凡例が表示される。凡例の位置は、upper/lowerleft/rightをスペースで繋いだ文字列で指定。

グラフの表示

pyplot.show()でグラフを表示させている。