matplotlib.pyplot.scatter – 散布図

概要

scatterはx座標とy座標のペアを与えて散布図を描く。

scatter(x, y, color/c=color, s=n, marker=marker, edgecolors=color)
xyは散布図の点の座標で、数値の場合は1点、配列の場合は複数の点を描く。color(またはc)とedgecolormatplotlibcolor指定markermatplotlibmarkers指定sはマーカーのサイズ。

基本形

複数系列

複数系列の場合は、系列ごとにscatterを実行する。

Irisデータセット

概要

Irisデータセットはアヤメの種類と特徴量に関するデータセットで、3種類のアヤメの花弁と萼(がく)に関する特徴量について多数のデータを提供する。

ここではPythonのscikit-learnにあるirisデータの使い方をまとめる。

データの取得とデータ構造

Pythonで扱う場合、scikit-learndatasetsモジュールにあるload_iris()でデータを取得できる。データはBunchクラスのオブジェクトととのことだが、通常の扱い方は辞書と同じようだ。

データの構造は辞書型で、150個体のアヤメに関する特徴量の配列と各個体の種類、種類名などが格納されている。

データのキーは以下のようになっている。

データの内容

'data'~特徴量データセット

150個体のアヤメに関する、4つの特徴量をレコードとしたデータセット。各個体の4つの特徴量の配列を要素とした2次元配列。列のインデックス(0, 1, 2, 3)が四つの特徴量に対応している。

'target'~アヤメの種類に対応したコード

3種類のアヤメに対応した0~2のコードの配列。150個体のアヤメに対応した1次元配列。

'target_names'~アヤメの種類名

アヤメの3つの種類の種類名。stosaは「ヒオウギアヤメ」といって少し大人締めの色形だが、versicolorとvirginicaは素人にはその違いがよく分からない。

種類名とコードの関係は以下の通り。

setosa 0
versicolor 1
virginica 2

'feature_names'~特徴名

データの格納順はDESCRの後。アヤメの種類のクラス分けに使う特徴。

sepal(萼)とpetal(花弁)の長さと幅、計4つの特徴の名称が、単位cmを含む文字列で格納されている。

  • ‘sepal length (cm)’ 萼の長さ
  • ‘sepal width (cm)’ 萼の幅
  • ‘petal length (cm)’ 花弁の長さ
  • ‘petal width (cm)’ 花弁の幅

特徴名とコードの関係は以下の通り。

sepal length (cm) 0
sepal width (cm) 1
petal length (cm) 2
petal width (cm) 3

'filename'~ファイル名

これも格納順はDESCRの後で、CSVファイルの位置が示されている。1行目にはデータ数、特徴量数、特徴量名称が並んでおり、その後に150行のアヤメの個体に対する4列の特徴量と1列の種類データが格納されている。このファイルにはfeature_namesDESCRに当たるデータは格納されていない。

'DESCR'~データセットの説明

データセットの説明。print(iris_dataset['DESCR'])のようにprint文で整形表示される。

  • レコード数は150個(3つのクラスで50個ずつ)
  • 属性は、4つの数値属性とクラス(種類)
    →predictiveの意味とclassが単数形なのがわからない

データの利用

データの取得方法

irisデータセットから各データを取り出すのに、以下の2つの方法がある。

  • 辞書のキーを使って呼び出す(例:iris_dataset['DESCR']
  • キーの文字列をプロパティーに指定する(例:iris_dataset.DESCR

全レコードの特徴量データの取得

'data'から、150の個体に関する4つの特徴量が150行4列の2次元配列で得られる。4つの特徴量は’feature_names’の4つの特徴名に対応している。

特定の特徴量のデータのみ取得

特定の特徴量に関する全個体のデータを取り出すときにはX[:, n]の形で指定する。

特定のクラスのデータのみ抽出

特定のクラス(この場合は種類)のレコードのみを抽出する方法。ndarrayの条件による要素抽出を使う。

 

 

2次元で配置されたAxesを一括で扱う

subplots()add_subplot()で複数の行数・列数のAxesを生成すると、Axesオブジェクトの2次元の配列となる。

この結果に対して一律に処理をしたい場合(たとえば軸の値や凡例を設定したい、アスペクトを揃えたいなどの場合)、いちいち二重ループを回すのが面倒。

これを1次元配列に変換して一括で扱う方法

変換方法の1つは、以下のように1次元配列で取り出してしまう方法

あるいは、以下のように2次元配列を1次元に変換する方法(当初、reshape(1, -1)[0]のようなことをしていたが、reshape(-1)とすればよいことがわかった)。

こうすると1次元配列axs_1dで2次元のaxsの全要素に対してアクセス可能になる。

このほかにflatten()、ravel()を使う方法もある。flatten()はコピーを返すが、Axesオブジェクトへの参照先は変わらないので同じ効果。

各グラフにカウンターの値を適用するときはenumerate、他のリストなどと同時に変えていくときはzipを使う。

 

matplotlib.pyplot.hist – ヒストグラム

概要

matplotlib.pyplot.histは、配列データのヒストグラムを描画する。主なパラメータのみ示す。

hist(X, bins, range, density, cumulative, histtype, rwidth, color, stacked)
Xはヒストグラムのデータで一つのグラフに一つの1次元配列。その他のパラメーターは以下で説明。

ヒストグラムの形式

度数分布

1次元の配列でデータを渡すと、その度数分布が描かれる。

ただしデフォルトでは各ビンのエッジが区別できないため、これを描くためにはedghecolorの指定が必要。edgecolorの代わりにecで指定してもよい。

頻度分布

density=Trueを指定すると、頻度分布になる。各ビンの総和が1となるように調整され、形状は度数分布と同じ。

累積分布図

cumulative=Trueを指定すると、累積度数分布、累積頻度分布を描く。

ビン数

binsでヒストグラムの柱(ビン)の数等を指定する。デフォルトはbins=10

bins=n
ビンの数を数値で指定する。
bins=sequence
ビンの境界値をリスト等で指定する。

ビン(bin)は英語で、店の商品や工場の部品などを入れておく大きなケース、ストッカーのことをいい、British Englishではごみ箱を指す。日本語の瓶(びん)の呼び名とは関係ないらしい。

レンジ

rangeでヒストグラムのビンを分割する範囲を指定する。そのレンジの上下限値の間でbinsで指定されたビンに分割される。

色・エッジの指定

colorでビンの色、edgecolor/ecでエッジの色、linewidthでエッジの幅を指定する。

ビンの幅

rwidthでビンの幅を指定する。デフォルトはrwidth=1で各ビンが密着。

ヒストグラムのタイプ

histtype='type'でヒストグラムのタイプを指定する。

bar
一般的なヒストグラムの形状。
barstacked
複数のヒストグラムの場合に、同じビンの値を積み上げていく。
step
ビンの間の境界を描かない。
stepfilled
ビンの間の境界を描かず、中を塗りつぶす。

以下の例では、'bar''step''stepfilled'について例示。

複数のヒストグラム

単純な重ね合わせ

複数のヒストグラムを重ね合わせるには、同じターゲットに対して各データについてhistを実行する。

単に重ね合わせると、初めの方のヒストグラムが後の方で塗りつぶされてしまうので、それらを見えるようにするにはalphaで透明度を指定する。

ただし単に重ね合わせただけの場合、各ヒストグラムのビンの境界が必ずしも一致しない。

ヒストグラムとplotの重ね合わせ

こちらを参照。

ビン境界の整合

複数のヒストグラムのビンの境界を一致させるには以下の方法がある。

  • 各グラフに対して同じrangebins=nを指定する
  • 各グラフに対して同じbins=sequenceを指定する

並べる・積み上げる

複数のデータを配列とした場合(複数の1次元のデータを並べて2次元配列として与えた場合)、デフォルトでは各ビンが横に並べられる。

また、stacked=Trueあるいはhisttype='barstacked'を指定した場合、同じ階級のビンが積み上げられる。

戻り値

n
各ビンの値(度数または頻度)
bins
各ビンの境界値
patches
ヒストグラム描画に使われたpatcheオブジェクトのリスト

単一のヒストグラムの場合

以下の例では、nの結果として10個のビンの度数が得られている。

複数のヒストグラムの配列の場合

複数のデータを配列で与えた場合の戻り値。nが3つのデータごとの配列になっている。

 

Python3 – 配列要素の重複を除く

リスト要素の重複を除く

リストをset()関数の引数にすると、重複する要素がなくなり全ての要素がユニークになる。

ただし結果は集合なので、これをリスト化するにはlist()関数を使う。

set()関数の結果、要素は昇順に並んでいるが、hashの計算方法によって必ずしも昇順になると決まってはいない。そこでsorted()関数でリストをソートしておく(生成されたリストをほかで再利用しないなら、sort()メソッドを使ってもよい)。

ndarrayの要素の重複を除く

元の配列がndarrayで与えられた場合でも、set()関数を適用すると結果は集合となるが、ndarrayの生成時に引数を集合とすると配列として生成されずに集合のまま。

そこで、list()関数でいったん集合をリスト化してからndarrayにする必要がある。

また、要素の昇順を保証するためにnp.array()関数でソートしておく。生成した配列を再利用しないのであれば、ndarraysort()メソッドを使ってもよい。

利用例~クラス値を持つデータの分類

たとえば多数のデータの特性値とクラス区分が配列で与えられた場合、クラスごとにマーカーの形や色を変えてプロットするなど、クラスごとに元のデータを分けて処理したい場合。

以下のようにset()関数で重複を除いてループ処理できる。

 

matplotlib.pyplot.quiver – ベクトル場

概要

matplotlib.pyplot.quiver()はベクトル場を可視化する。基本的なパラメーターは以下の通り。

quiver(X, Y, U, V, [C])
X, Yはベクトルの開始点、U, Vはベクトルの成分、Cはベクトルの大きさに応じたカラーマップ上の色をつけるための配列。

単一のベクトルの描画例

以下の例では、始点の位置と成分を1つずつ指定してベクトルを描画している。デフォルトではベクトルのスケールは描画領域に対して自動的に調節されるが、ここでは描画領域のスケールと同じになるようパラメーターを設定している。

matplotlibのドキュメントでは、scale_unitsのところに以下のように書かれている。

“To plot vectors in the x-y plane, with u and v having the same units as x and y, use angles='xy', scale_units='xy', scale=1

ベクトル場の描画例

以下の例では、xy平面上の位置に応じた成分を持つベクトルを描画している。関数のgradientのイメージ。

描画にあたって、開始点の座標とベクトルの成分をmeshgridで生成している。

1つ目の図は単に開始点と成分を与えただけで、単一の色で、ベクトルのスケールは自動調節されている。

2つ目の図はスケールと色付けのための配列を指定し、ベクトルの大きさに応じてcolormapで色を付けている。

Axes.spines~軸の設定

概要

グラフのx軸、y軸の位置や表示の有無については、Axesオブジェクトのspinesプロパティーで制御する。

spinesは辞書型でbottomtopleftrightのキーで対象を指定し、表示位置はset_position()メソッド、表示の有無はset_visible()で操作する。

軸の指定

spines['bottom']spines['left']は下と左の軸で、軸の値が表示される。

spines['top']spines['right']は上と右の軸で、ただ線が引かれるだけ。

各軸に対して、set_positon()set_visible()の各メソッドを実行して、位置や可視/不可視を設定する。

軸の表示・非表示

set_visible(False)で軸を非表示にする。

以下の例では、上の軸と右の軸を非表示にしている。

ゼロ位置/中央に軸位置を設定

set_position(‘zero’)でゼロの位置に、set_position(‘center’)で描画位置の中央に軸をセットできる。set_visible()と組み合わせて使うケースが多そう。

軸の位置の数値指定

set_position()の引数として、タプルで('指定方法', 値)の形で与える。

指定方法
data 各軸を配置するx、yの値。
outward 単位はポイントで、正なら描画領域の内側、負なら外側に配置。
axes 描画領域の高さ・幅に対する割合。

Python3 – コレクションのソート

リストのソート

sort()メソッドは破壊的処理

sort()はリストのメソッドで、元のリストの内容を変更する(破壊的処理)。メソッドの実行結果はNone

降順にソートしたいときは、引数reverseTrueで指定。

sorted()関数は非破壊的処理

sorted()関数は引数のリストのソート結果を返す。元のリストの内容は変更されない(非破壊的処理)。

降順ソートの指定はsort()メソッドと同じ。

文字列は辞書順でソートされる

ndarrayの場合の注意

sorted()はそのままではndarrayにならない

ndarrayをsorted()関数の引数にすると、エラーにはならないが結果はリストで返されるため、配列への変換が必要。

numpy.sort()は非破壊的にndarrayをソートできる

numpy.sort()関数は、引数のndarrayのソート結果を返し、元のndarrayは変更しない。リストの場合のsorted()関数と同じ動作。

ndarraysort()メソッドは破壊的

ndarraysort()メソッドは、元の配列の内容を書き換える。リストのsort()メソッドと同じ挙動で、実行結果の戻り値はNone

辞書のソート

今後

 

Python3 – zipによる複数リストの並行ループ

2つのリストの要素を並行して取得しつつ処理したい場合、zip()関数を用いる。

zip()関数は、引数で与えた複数のコレクションの要素が対になったタプルのイテレーターを返す。各コレクションの長さが異なる場合、イテレーターの長さは最も短いコレクションの長さとなり、それ以降の各コレクションの要素は無視される。

 

 

matplotlib.pyplot.contour/contourf – 等高線

contour~コンターライン

matplotlib.pyplot.contour()は2次元平面上のコンター(等値線)を描く。x, yの値から計算されたzの値が等しい点を曲線で結ぶ。

x, y, zの指定方法

引数がzのみの場合

以下のコードでは、zの値のみを2次元配列で与えている。この場合は、配列zのインデックスの値が座標値となる(行番号0~20がy座標、列番号0~16がx座標)。

引数に1次元のx, yを指定

以下のコードでは、x, yを1次元配列で引数として渡している。この場合は、x, yの値が座標値として用いられる(x座標が-1~1、y座標が-1.2~1.2)。

meshgridを使う方法

最も一般的な方法。x, yの1次元配列からnumpy.meshgrid()メソッドでそれぞれの2次元配列を生成し、それらを使ってzを計算するとともに、contour()の引数に与える。結果は上と同じになる。

ラベル

コンターの値をラベル表示させる。手順としては、contour()で描画した際の戻り値のオブジェクトを保存しておき、それをclabel()の引数として与える。

コンターレベル

コンターの数をlevelsで指定する。数値で指定する方法と、配列等で指定する方法があるが、数値で指定する方法は条件によって期待した結果にならないことがある。

数値による指定

1つの整数値で指定する場合、ドキュメンテーションでは以下のように書かれている。

“If an int n, use n data intervals; i.e. draw n+1 contour lines. The level heights are automatically chosen.”

すなわち、n個の間隔に対してn+1本のコンターが描かれることになっている。

以下のコードを実行してみる。

範囲と関数の関係によって、同じlevels=5を指定しているのにコンターの本数が異なる。ドキュメント通りなら、5つの間隔に対して6本のコンターが描かれるはずだが、左は6つの間隔に対して5本、右は5つの間隔に対して4本。

右の図の場合は左下でz2 = 0、右上でz2 = 4となり、コーナーの点がコンターに含まれているとすると勘定は合う。左はこれが合わないが、桁落ちなのかゼロが含まれるときに挙動が違うのか、よくわからない。

以下のようにlevels=1とした場合も、挙動が一定しない。

配列等による指定

levelsをリストなどで指定すると、その要素で指定された値のコンターを描く。要素は昇順でなければならない(昇順でない場合は実行時エラー)。

線のデザイン

linewidths~線の太さ

線の太さはlinewidthsで指定する。1つの数値で指定した場合は全てのコンターラインに適用、配列等で指定した場合は、サイクリックにその太さが適用される。赤字で示したように、引数名の最後に”s”が着く点に注意。

linestyles~線のスタイル

linestilesで、線のスタイルをスタイル名で指定する。複数指定した場合はサイクリックに適用される。

なお、線の色に単色を用いた場合は、負の値のコンターラインが破線('dashed')で描かれるが、この例は次のcolorsのところで示す。

colors~線の色

コンターラインの色はcolorsで指定する。配列等で指定するのが標準だが、単色の場合は配列化せず色名のみで指定可能。ただしその場合は、red, blue等の色名による指定方法のみ。

単色指定の場合、負の値に対するコンターは破線となる。

If linestyles is None, the default is ‘solid’ unless the lines are monochrome. In that case, negative contours will take their linestyle  fromrcParams["contour.negative_linestyle"] = 'dashed' setting.

cmap~カラーマップ

線の色にcolormapを適用できる。

alpha~透過度

線によるコンターではあまり意味がないが、線の透過度を0 ~1の実数で指定できる。

contourf~色付きのコンターエリア

contourfはコンターラインで区切られた各エリアを色付けする。

ラベル

contourfでラベルを付けることはあまり想定されないが、contourと同じようにすると図が崩れてしまう。contourcontourfの合わせ技がよい。

デザイン

cmap~カラーマップ

コンターエリアの色分けにカラーマップを指定できる。

 

alpha~透過度

透過度を1未満に設定して、透過させることができる。