matplotlib (Python) で円グラフ

【実現したいこと】

matplotlibを利用して円グラフを作成する。

【参考】
公式のサンプルコード

【サンプルコード】

【作成されたグラフ】
pie

Numpyのloadtxtで空のファイルを開くとUserWarning

【やりたいこと】
loadtxt()が空のファイルを読んだとき、以下のメッセージを出してくる。

UserWarning: loadtxt: Empty input file

いつも使っているデータ加工用スクリプトでは、空のファイルを読むことが多い(織り込み済み)。
このメッセージを連発されると鬱陶しいので、例外処理を使っておとなしくさせたい。

つまり、Warningを例外処理と同じようにキャッチしたい。

 

■そもそもUserWarningとは

例外処理の仲間。

Exceptionの子クラスWarningは「エラーとして止めちゃうほどではないけど、警告はしたい」ときに使う。

Warningの子クラスUserWarningはユーザのコードによって生成される警告。

参考リンク

6. 組み込み例外 — Python 2.7ja1 documentation:

 

【実現方法】
参考リンク
In python, how does one catch warnings as if they were exceptions? – Stack Overflow:
27.6. warnings — 警告の制御 — Python 2.7ja1 documentation:

リンクにあるように、警告フィルタを使って、警告を例外として扱えるようにする。

また、Warningの上位クラスである(Exceptionのさらに上位クラスの) BaseExceptionは、str()関数に渡すと、
引数 の文字列表現を返してくれる。

 

【サンプルコード】

matplotlibでヒストグラムのグラフを作成する その2

matplotlibでヒストグラムのグラフを作成する(別記事)の延長。

ヒストグラムとは、ある区間(ビン)に属するデータの数(頻度、度数)を数えた数列である。

異なる点は(データの内容が未知で)最小値・最大値が不明であるという点。
つまり、グラフの横方向の変域が不明ということ。

さらに言い換えると、Rangeを指定せずに、ビンの幅だけを指定してヒストグラムを生成する。

【実現方法】
matplotlib.pyplot.hist(公式API)を使う。

返り値は(n, bins, patches) のタプルなので、A, B, C = pyplot.hist()とでもすれば取得できる。

ここで、

n : 縦軸の値の数列
bins : 横軸の区切りとなる座標(各ビンの始点)
patches : patchの集合。patchとは何かはココを参照。

とここまでは、前記事と同じ。

 

【サンプルコード】

 
【生成されるグラフ】

histgram.png

ヒストグラム

matplotlibで棒グラフ(横に並べる)

【やりたいこと】

こちらで示した積み上げるタイプではなく、横に並べるタイプの棒グラフを描く。

 

【サンプルコード】

 

【生成されるグラフ】

横に並んだ棒グラフ

横に並んだ棒グラフ

文字列(String)の配列で足し算を行う

【やりたいこと】

文字列を要素とした配列同士の足し算を行いたい。

公式のTutorialにもあるように、Numpyでは四則演算(+-*/)のオペレータを使うと、配列の要素同士で計算を行う。結果は新しいオブジェクトに格納される。

ところが、Stringの要素を持つnumpy.ndaaryに関しては、四則演算に関するオペレータがサポートされていない。

 

【解決策1】

公式APIにあるように、String同士のoperationに関するインターフェースは用意されている。

例えば、文字列同士を単純に結合する+に相当するのがnumpy.core.defchararray.add関数である。

 

【サンプルコード】

 

【解決策2】

  1. string型からobject型にキャストする。
  2. objectの配列同士をnumpy.add関数で結合
  3. 結合した配列をstring型にキャストする。

 

【サンプルコード】

Numpyでの1次元配列

【困ったこと】

Numpyにおいて1次元配列が縦方向なのか横方向なのかが、複数のファイルの間でぐちゃぐちゃになったので整理をしておく。

 

【ファイル入力について】

1次元データは縦方向でも横方向でも入力可能。

入力した後はnumpy.ndarrayの一次元配列オブジェクトに格納されるので、入力前が横方向でも縦方向でも差はない。

 

【ファイル出力について】

1次元データは縦方向に出力される。

 

【サンプルコード(入力データ<縦方向>)】

【サンプルコード(入力データ<横方向>)】

【サンプルコード】

 

【一次元データを横方向に出力する】

出力するデータの次元数を増やしてやればよい。

インデクスにNoneを指定してやると実現可能。

 

【サンプルコード】

 

【補足】

array[i][j]のiは縦方向、jは横方向になる。

例えば、2×3行列mat

1 2 3
4 5 6

はmat=np.array([ [1,2,3], [4,5,6] ])と表される。
この[1,2,3]がmat[0]であり、[4,5,6]がmat[1]となる。

要素が1つしかない配列をfor文に渡すとエラーがでる

【困ったこと】
numpy.loadtxt()で要素が一つしかない配列を読み込んだとき、その配列をfor文に渡すと、以下のエラーが出る。

TypeError: iteration over a 0-d array

例えば、以下のような一要素の配列がファイルに格納されているケースを考える。

このファイルをnumpy.loadtxt()で読み込んだ場合、0-d arrayとしてnumpy.ndarrayオブジェクトが生成されることがある。

中盤のndimからわかるように、0次元配列である。

【対策】

読み込むファイルが要素1つになり得る場合は、numpy.loadtxt()ndminオプションを利用する。

最低次元数を1にすることで、上記のエラーを回避できる。