コンピュータを研究に使うための私的メモ。Python、Fortran、Ubuntu、etc...

matplotlib.pyplotをpltとしてインポートしておく。

折れ線

plt.plot(x,y,'r+')
plt.plot(x)         #argsが一つのときはx軸の配列が0,1,...,N-1となる。
色や線種・マーカーの形などをkeywordsに指定できる。こちらで確認。
  • 主なオプション
c/color
markerマーカー
linestyle線種
lw太さ
msマーカーのサイズ
  • 主な色
'b''r''m'マゼンダ'k'
'g''c'シアン'y'黄色'w'
他にも色名('gray'などHTMLで定義される名前)や16進数表現('#008000'など)でも指定できる。
  • 主な線種
-実線
--破線
:点線
-.一点鎖線
  • 主なマーカー

折れ線間を塗りつぶす

plt.fill_between(time, temp[year,30:92,3], where=temp[year,30:92,3]>0,\
                           color='orange', alpha=0.5)
plt.fill_between(time, temp[year,30:92,3], where=temp[year,30:92,3]<0,\
                           color='skyblue', alpha=0.5)

破線のスタイルを任意に設定する

dashesキーワードを用いることで、線種もっと自由に設定できる。dasesはタプルで表し(破線の長さ, 間隔)を指定する。鎖線の間隔も任意に指定可能。

ヒストグラム

plt.hist(array, 分割数, **keywords)

散布図

plt.scatter(x,y,edgecolor='black',color="blue",s=サイズ,marker=マーカー)
  • オプション
sマーカーのサイズ。配列を渡して点ごとに指定すればバブルチャートになる。
c色。['blue','red',...]のようなリストを渡して点ごとに指定できる。数値の配列を指定すると値に応じたグラデーションになる。
color色を指定するが2次元配列でrbg指定?
markerマーカーの種類
cmapc/colorに数値の配列を指定する場合のグラデーションをカラーマップで指定できる。

散布図にグラデーションをつける。

3次元データを散布図で指定する場合3つ目の次元のデータをcolorに指定するとグラデーションをつけることができる。グラデーションの付け方はcmで指定。
import matplotlib.cm as cm

SC=plt.scatter(x, y, color=z, cmap=cm.gist_rainbow)
plt.colorbar(SC)                                                                   #カラーバー


グラデーションの上限と下限は自動で設定されるが任意に指定したい場合はカラーマップに0から1になるように調整して値を渡す。例えば3番目の値の配列valを上限が7下限が0になるようにグラデーションしたい場合は、
plt.scatter( x, y, c=cm.jet(val/7.) )

棒グラフ

plt.bar(barの左側のx座標,barの高さ)  #縦棒グラフ
plt.barh(barの左側のx座標,barの高さ) #横棒グラフ

2次元座標へのプロット

基本

グリッド座標の2次元配列を作ってuniversal functionを使って計算し配列をプロットする。
#最大最小値
xmin = x.min()
xmax = x.max()
ymin = y.min()
ymax = y.max()

#グリッド,100分割
X, Y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
#あるいは先に配列を用意して
X, Y = np.meshgrid(x, y)

#brodcastingをうまく使ってx*yの配列Zをつくる。
Z = phi0*np.exp(-Y**2/2.)*np.exp(1j*(X-t))

コンター

デフォルトでは配列Zの[0,0]が左下座標(xmin,xmax)に設定される。
plt.contour(Z, extent=[xmin,xmax,ymin,ymax])
デフォルトではグラデーションでコンターが描かれる。単色にしたい場合は
plt.contour(Z, colors='k')
のように色を指定する。単色の場合は負の値のコンターは破線(dashed)で描かれる。
  • オプション
colors線の色
linewidths線の太さ。

負のコンターの線種を指定する。

負の値のコンターの線種を指定したい場合は一番最初に、
import matplotlib
matplotlib.rcParams['contour.negative_linestyle']='solid'
のように指定する。ただしバージョン1.1.0ではsolidかdashedしか指定できない。
  • 裏技
以前のバージョンではcontour.negative_linestyleを'6.0, 6.0'のように2つの数字のペアで指定することで破線の間隔や長さを自由に決めることができたが1.1.0ではエラーが出て設定が制限されている。ソースコードをいじることで1.1.0でも実現できたのでメモ。ただし他のところで影響がでてしまうかもなので慎重に。
  1. rcsetup.pyの279行目でオリジナルの線種の名前を追加する。
validate_negative_linestyle = ValidateInStrings('negative_linestyle',['solid', 'dashed','semidashed'], ignorecase=True)
ここではsemidashedという線種を新たに作った。
  1. backend_bases.pyの653行目に線種のリストがあるのでそこに破線の長さ、間隔をタプルで追加する。
# a mapping from dash styles to suggested offset, dash pairs                                                                                                                                   dashd = {
        'semidashed' : (0, (5.0, 3.0)),
        'solid'   : (None, None),
        'dashed'  : (0, (6.0, 6.0)),
        'dashdot' : (0, (3.0, 5.0, 1.0, 5.0)),
        'dotted'  : (0, (1.0, 3.0)),
              }
これでdashedより間隔のつまったsemidashedという線種を指定できるようになる。
import matplotlib
matplotlib.rcParams['contour.negative_linestyle']='semidashed'
とするか~/.matplotlib/matplotribrcに記述してデフォルトにしておく。

コンター間隔を指定する

interval = np.arange(0,1,0.01) #0から1まで0.01間隔
plt.contour(Z, interval, extent=[xmin,xmax,ymin,ymax])

等間隔でコンターをひく

locatorオブジェクトを使えば等間隔、ログスケールなどコンターの引き方を指定できる。
#N間隔で引く
plt.contour(Z,locator=MultipleLocator(N))

コンターラベルをつける

pyplot.contourの返り値インスタンスに対して指定する。
CR = plt.contour(Z)
plt.clabel(CR, fontsize=9, fmt='%1.1f')
#もしくは
CR.clabel(fontsize=9, fmt='%d')
  • オプション
fontsizeフォントサイズ
fmtラベルのフォーマット

コンターラベルをつける値を指定する。

何も指定しないと引かれたコンターすべての値にラベルがふられるが、リストを渡すとその値のみラベルがふられる。
CR = plt.contour(Z)
#5500, 6000のコンターにのみラベルをふる
CR.clabel([5500,6000], fontsize=9, fmt='%d')
contour()の返り値にはコンターが引かれた値のリストが保持されているのでこれを利用するのが便利。
#2つおきにラベルをつける。
levels = CR.levels
CR.clabel(levels[::2])
#5000以上のコンターにのみラベルをつける
CR.clabel(levels[levels>=5000])

塗りつぶしコンター(contourf)

contourの間を塗りつぶす。gradsのgxout shadedみたいになる。
CF = plt.counrourf(X, Y, Z, interval)
  • オプション
extend指定したコンターレベルの外側を塗りつぶすかどうか。塗りつぶさない(neither)、両側塗りつぶす(both)、上限側のみ(max)、下限側のみ(min)

塗りつぶしの上限・下限、未定義値の色を指定する

extendでneither。max、min、bothの場合はそれぞれ上限、下限の外側に別の色で自動的に延長される。またデフォルトでは未定義値(マスク)は塗りつぶされない。上限、下限の外側や未定義値の色はcolormapに指定する。
set_over()上限の外側の色を指定(max, bothで有効)
set_under()下限の外側の色を指定(min, bothで有効)
set_bad()maskedされた箇所の色を指定
cmap=cm.jet_r
cmap.set_over('w')     #interval上限より外側は白色で塗りつぶす。

CF = plt.counrourf(X, Y, Z, interval, cmap=cmap)
応用として例えば、
cmap.set_over('w', alpha=0)
alphaの値をゼロにすると透明になるのでこの範囲は塗りつぶさないようにできる。こうすればカラーバーにも塗りつぶさないことが示されてきれいな図がかける。

非等間隔の値に対してカラーマップを等間隔にする

コンター(塗りつぶし)の色をカラーマップで自動的に生成する場合は、色の変化はコンターの値に比例して線形に生成される。したがって非等間隔の値で引くとカラーマップの変化が均一でなくなってしまう。
例えば、
interval = [0.1,1,5,10,20,30,50,80]
CF = plt.counrourf(X, Y, Z, interval, cmap=cm.jet)
のようにするとコンター間隔の狭い部分で色の変化が弱くなってしまう。



間隔をそろえるにはnormを指定する。
interval = [0.1,1,5,10,20,30,50,80]
interval_norm = [0.1,1,5,10,20,30,50,80,100]     #上限の色を生成するために一つ多めにする。  
cmap = cm.jet
cmap.set_under('w', alpha=0)                                     #下限の色は具体的に指定。
norm = colors.BoundaryNorm(interval_norm,256)

CF = plt.counrourf(X, Y, Z, interval, cmap=cmap, norm=norml)



normで指定する場合の色はinterval_normの配列の要素数しか生成されないようなので、extendがneitherでない場合は上限、下限の色をset_under()等で指定するか、intervalのの最初と最後に適当な値を追加してinterval_normに与えることで解決した。

カラーバー

contourfやcontourのカラーバーを描画する。
CF = plt.counrourf(X, Y, Z, interval)
CB = plt.colorbar(CF)
CB.set_label('color bar')                            #カラーバーのラベル
  • オプション
orientationvertical or horizontal
ticksメモリをふる値をリスト/Locatorオブジェクトで指定。何も指定しない場合は自動的に決まる
padカラーバーと図の軸の間の余白。デフォルトは横向きは0.15、縦向きは0.05
shrink図の軸(横向きなら横軸、縦向きなら縦軸)の長さとカラーバーの長さ/高さの比
aspectカラーバーの長辺と短辺の比

任意の位置にカラーバーを描く

普通にplt.colorbarを使うと図に対しての位置関係で指定するのでマルチプロットのときなど自由に位置を決めたいときがある。以下のようにする。
cax = fig.add_axes([0.2, 0.05, 0.6, 0.015])          #[左端、下端、幅、高さ]
plt.colorbar(CF, cax, orientation='horizontal')

カラーバーのフォントサイズを変える。

for t in cb.ax.get_xticklabels():
    t.set_fontsize(10)
カラーバーが縦向きなら、
for t in cb.ax.get_yticklabels():
    t.set_fontsize(10)

図(Axes)に対して適切な位置にカラーバーを描画する。

pyplot.colorbar()メソッドを使えば、もとの図のサイズを調整して高さや位置が合うようにカラーバーが描画される。自作のクラスを使う場合などではこの調整がされないので、以下のように実装する。
from mpl_toolkits.axes_grid1 import make_axes_locatable

divider = make_axes_locatable(ax)
cax = divider.append_axes(location, size=size, pad=pad)
CB = fig.colorbar(mappable, orientation=orientation, cax=cax)

カラーバーの軸ラベルの指数部分を省略する。

CB = plt.colorbar(CF)
CB.formatter.set_scientific(True)
CB.formatter.set_powerlimits((0,0)) 
CB.update_ticks() 

カラー

グラデーションで塗りつぶす。デフォルトでは配列Zの[0,0]の指定がcontourと違う。contourと併用する際はoriginオプションできちっと指定すること。
plt.imshow(Z, extent=[xmin,xmax,ymin,ymax], origin='lower')
  • オプション
vmin/vmax最小/最大値
extent軸上のデータの境界。[xmin,xmax,ymin,ymax]
cmapカラーマップ。matplotlib.cmクラスを渡す。

ベクトル

#ベクトル(U,V)を描画。X,Yは座標で省略すると配列のインデックスで描かれる
plt.quiver(X,Y,U,V, angles='xy')
#3番目の次元Cをカラーで与えることもできる
plt.quiver(X,Y,U,V,C, angles='xy')
間引くときはスライスを使う。
plt.quiver(X[::50,::50],Y[::50,::50],U[::50,::50],V[::50,::50])
  • スケールオプション
    • units
単位をどのように定めるかを指定する。
width/height描画領域(軸)の幅/高さを1とする。図の拡大にあわせて比を保つ。
dots/inches図のdpiに基づいたピクセル/インチ
x/y/xyx軸/y軸/sqrt(x**2+y**2)の1単位を1とする
    • angles
矢印のアスペクト比
uvデフォルト。アスペクト比は1。
xyxy軸のアスペクト比に合わせる。
デフォルトではアスペクト比1の'uv'だが通常、図のアスペクト比は1ではない。したがってangles='xy'を指定しないとベクトルの向きが正しく表現されないので注意。
    • scale
unitsに対するスケールを指定。
  • 矢印の形状のオプション
widthに対する比で指定する。
width矢印の柄の部分の幅
headwidth矢羽の部分の幅(柄に垂直な方向)
headlength矢羽の部分の長さ(柄に沿った方向)
headaxislength矢羽の付け根部分の長さ
矢じりの部分を太くしたければ(三角型)headaxislengthを大きくする。逆にやじりではなく矢印にしたいばあいは指定しないで、headwidthやheadlengthを大きくする。
  • その他
pivotグリッドに矢印のどこを合わせるか。 ‘tail’, ‘middle’ ,‘tip’が選べる
color色を指定、3番目の次元を指定したときは?

スケールの図示

pyplot.quiverのインスタンスに対して指定する。reference arrow の長さは quiver のscale に対する長さを指定する。すなわち長さ1はquiverで指定した(units)×(scale)に相当する。
Q = plt.quiver(X,Y,U,V)
plt.quiverkey(Q, x位置,y位置,長さ,単位(文字))
  • オプション
labelposreferrence allowに対するラベル(文字)の位置。N,S,E,Wで指定。
fontpropertiesフォントを辞書で指定。例:{'family':フォント,'size':サイズ}
オプション:headwidth=5,scale=2,units='xy',pivot='middle'

コミックスタイルのプロット

バージョン1.3からxkcdスタイルのコミック風のプロットのスタイルが追加されている(公式デモ)。

フォントのインストール

xkcdスタイルでは、Humor Sansというフォントが必要である。インストールされていない場合は、こちらからHumor-Sans.ttfをダウンロードして、~/.fontsや/usr/local/share/fontsなどのフォントディレクトリに置く。フォントが反映されなければ、
$ sudo fc-cache -fv
としてフォントキャッシュを更新する。
新規インストールではなく、アップデートの場合matplotlibのフォントキャッシュが残っていて、
/usr/local/lib/python2.7/dist-packages/matplotlib/font_manager.py:1236: UserWarning: findfont: Font family ['Humor Sans', 'Comic Sans MS'] not found. Falling back to Bitstream Vera Sans
  (prop.get_family(), self.defaultFamily[fontext]))
のようなエラーメッセージが出る場合がある。この場合は、キャッシュディレクトリ(1.3以降は~/.cache/matplotlib、それ以前は~/.matplotlib)にあるfontList.cacheを削除する。キャッシュディレクトリは、
import matplotlib
matplotlib.get_cachedir()
で確認できる。

プロットする。

plt.xkcd()
plt.plot(np.sin(np.arange(10))

情報

管理人/副管理人のみ編集できます