matplotlib.pyplotをpltとしてインポートしておく。
他にも色名('gray'などHTMLで定義される名前)や16進数表現('#008000'など)でも指定できる。
![](https://image01.seesaawiki.jp/m/n/met-python/b6a63dbe3d411889.png)
デフォルトではアスペクト比1の'uv'だが通常、図のアスペクト比は1ではない。したがってangles='xy'を指定しないとベクトルの向きが正しく表現されないので注意。
矢じりの部分を太くしたければ(三角型)headaxislengthを大きくする。逆にやじりではなく矢印にしたいばあいは指定しないで、headwidthやheadlengthを大きくする。
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' | 白 |
- 主な線種
- | 実線 |
---|---|
-- | 破線 |
: | 点線 |
-. | 一点鎖線 |
- 主なマーカー
![](https://image01.seesaawiki.jp/m/n/met-python/b6a63dbe3d411889.png)
plt.scatter(x,y,edgecolor='black',color="blue",s=サイズ,marker=マーカー)
- オプション
s | マーカーのサイズ。配列を渡して点ごとに指定すればバブルチャートになる。 |
---|---|
c | 色。['blue','red',...]のようなリストを渡して点ごとに指定できる。数値の配列を指定すると値に応じたグラデーションになる。 |
color | 色を指定するが2次元配列でrbg指定? |
marker | マーカーの種類 |
cmap | c/colorに数値の配列を指定する場合のグラデーションをカラーマップで指定できる。 |
3次元データを散布図で指定する場合3つ目の次元のデータをcolorに指定するとグラデーションをつけることができる。グラデーションの付け方はcmで指定。
![](https://image02.seesaawiki.jp/m/n/met-python/e3bcfcb83d4ac099.png)
グラデーションの上限と下限は自動で設定されるが任意に指定したい場合はカラーマップに0から1になるように調整して値を渡す。例えば3番目の値の配列valを上限が7下限が0になるようにグラデーションしたい場合は、
import matplotlib.cm as cm SC=plt.scatter(x, y, color=z, cmap=cm.gist_rainbow) plt.colorbar(SC) #カラーバー
![](https://image02.seesaawiki.jp/m/n/met-python/e3bcfcb83d4ac099.png)
グラデーションの上限と下限は自動で設定されるが任意に指定したい場合はカラーマップに0から1になるように調整して値を渡す。例えば3番目の値の配列valを上限が7下限が0になるようにグラデーションしたい場合は、
plt.scatter( x, y, c=cm.jet(val/7.) )
![](https://image02.seesaawiki.jp/m/n/met-python/0a9aca778e1627ad.png)
グリッド座標の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しか指定できない。
- 裏技
- rcsetup.pyの279行目でオリジナルの線種の名前を追加する。
validate_negative_linestyle = ValidateInStrings('negative_linestyle',['solid', 'dashed','semidashed'], ignorecase=True)ここではsemidashedという線種を新たに作った。
- 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))
何も指定しないと引かれたコンターすべての値にラベルがふられるが、リストを渡すとその値のみラベルがふられる。
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])
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の値をゼロにすると透明になるのでこの範囲は塗りつぶさないようにできる。こうすればカラーバーにも塗りつぶさないことが示されてきれいな図がかける。
![](https://image01.seesaawiki.jp/m/n/met-python/cb89728c26354c82.png)
コンター(塗りつぶし)の色をカラーマップで自動的に生成する場合は、色の変化はコンターの値に比例して線形に生成される。したがって非等間隔の値で引くとカラーマップの変化が均一でなくなってしまう。
例えば、
![](https://image01.seesaawiki.jp/m/n/met-python/0e6297a622d00485.png)
間隔をそろえるにはnormを指定する。
![](https://image01.seesaawiki.jp/m/n/met-python/a57f86e8c68ebe4e.png)
normで指定する場合の色はinterval_normの配列の要素数しか生成されないようなので、extendがneitherでない場合は上限、下限の色をset_under()等で指定するか、intervalのの最初と最後に適当な値を追加してinterval_normに与えることで解決した。
例えば、
interval = [0.1,1,5,10,20,30,50,80] CF = plt.counrourf(X, Y, Z, interval, cmap=cm.jet)のようにするとコンター間隔の狭い部分で色の変化が弱くなってしまう。
![](https://image01.seesaawiki.jp/m/n/met-python/0e6297a622d00485.png)
間隔をそろえるには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)
![](https://image01.seesaawiki.jp/m/n/met-python/a57f86e8c68ebe4e.png)
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') #カラーバーのラベル
- オプション
orientation | vertical 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)
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()
#ベクトル(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/xy | x軸/y軸/sqrt(x**2+y**2)の1単位を1とする |
- angles
uv | デフォルト。アスペクト比は1。 |
---|---|
xy | xy軸のアスペクト比に合わせる。 |
- scale
- 矢印の形状のオプション
width | 矢印の柄の部分の幅 |
---|---|
headwidth | 矢羽の部分の幅(柄に垂直な方向) |
headlength | 矢羽の部分の長さ(柄に沿った方向) |
headaxislength | 矢羽の付け根部分の長さ |
- その他
pivot | グリッドに矢印のどこを合わせるか。 ‘tail’, ‘middle’ ,‘tip’が選べる |
---|---|
color | 色を指定、3番目の次元を指定したときは? |
pyplot.quiverのインスタンスに対して指定する。reference arrow の長さは quiver のscale に対する長さを指定する。すなわち長さ1はquiverで指定した(units)×(scale)に相当する。
![](https://image01.seesaawiki.jp/m/n/met-python/29f448828b964158.png)
Q = plt.quiver(X,Y,U,V) plt.quiverkey(Q, x位置,y位置,長さ,単位(文字))
- オプション
labelpos | referrence allowに対するラベル(文字)の位置。N,S,E,Wで指定。 |
---|---|
fontproperties | フォントを辞書で指定。例:{'family':フォント,'size':サイズ} |
- 例
![](https://image01.seesaawiki.jp/m/n/met-python/29f448828b964158.png)
バージョン1.3からxkcdスタイルのコミック風のプロットのスタイルが追加されている(公式デモ)。
xkcdスタイルでは、Humor Sansというフォントが必要である。インストールされていない場合は、こちらからHumor-Sans.ttfをダウンロードして、~/.fontsや/usr/local/share/fontsなどのフォントディレクトリに置く。フォントが反映されなければ、
新規インストールではなく、アップデートの場合matplotlibのフォントキャッシュが残っていて、
$ 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()で確認できる。
最新コメント