ホーム > matplotlibの使い方 > グラフ作図のTIPS

matplotlib:グラフ作図のTIPS


作成者:山下陽介(国立環境研究所)



目次

[top]



matplotlibの基本

IPython上での操作方法

IPython上でpythonを使用する

Jupyter Notebook上での操作方法

Webブラウザ上でpythonを使用する

matplotlibのモジュール

matplotlib.pyplotモジュールをインポートする
import matplotlib.pyplot as plt
以降はpltとして参照できる

画面上に表示する

pythonスクリプトをコマンドラインで実行し画面上に表示したい場合、スクリプトの最後を次のようにする
plt.show()
IPythonをpylabモードで起動した場合は不要
Jupyter Notebook上で作図する場合は不要

画像ファイルを保存する

ファイル名の拡張子を判断して自動で変換される
plt.savefig("ファイル名")
現在、eps、jpeg、jpg、pdf、pgf、png、ps、raw、rgba、svg、svgz、tif、tiffに対応(3.6.0以降ではwebpにも対応)

matplotlibのデフォルト設定rcParamsを表示する

モジュールのimportでエラーが出る場合

MacPortsでpythonをインストールした場合 標準とは違う場所にあるモジュールをimportする場合

matplotlib作図スクリプトの基本

Pythonスクリプト

sample.pyのようなファイル名で作成する

Pythonスクリプトの実行方法

スクリプト実行時のWarning表示を消す

Pythonプログラムの文法チェックとインデント合わせ

スクリプト実行前にyapfコマンドを実行すると、文法エラーがある場合には出力し、PEP8に準拠する4文字のインデント合わせと見た目の調整を自動で行ってくれる。flake8を使うと、PEP8から外れたものを表示してくれる。

pythonプログラムをhtmlで表示

pygmentを使うと、ソースコードをhtmlで綺麗に表示することができる

サブプロット

プロットエリアの作成

サブプロットの作成

ax = fig.add_subplot(1, 1, 1)
戻り値の軸(サブプロット)axは、matplotlib.pyplotやインポートした際に設定する別名のpltに相当し、pltの代わりにaxでも作図メソッドを利用できる。

プロットエリアの作成とサブプロットの作成を同時に行うこともできる

複数のサブプロットを並べる

ax = fig.add_subplot(縦に並べる数, 横に並べる数, 番号)

サブプロットにタイトルを付ける

plt.title("タイトル")
axを使う場合
ax.set_title("タイトル")
タイトルの文字サイズや色を変更する参照

サブプロットにx軸、y軸のラベルを付ける

複雑なサブプロットの配置

GridSpecを使う

複数のサブプロットに1つのタイトルを付ける

サブプロットの中に別のサブプロットを配置

ax = fig.add_subplot(1, 1, 1) # 大枠の作成
ax2 = plt.axes([0.20, 0.27, 0.3, 0.2]) # 小枠の作成
与えるリストの要素は、x軸上の座標、y軸上の座標、横幅、縦幅の順

2軸グラフを作成する

ax1 = fig.add_subplot(2, 1, 1)
ax2 = ax1.twinx() # 2つのプロットを関連付ける
ax1では左側の軸、ax2では右側の軸が使われる

サブプロットのサイズを調整する

plt.subplots_adjust()
オプションの一覧は、プロット範囲の調整参照

複数のサブプロットを配置した時のx軸、y軸ラベルの付け方

サブプロットを縦に2、横に2配置し、左側の2つにはy軸ラベル、下側の2つにはx軸ラベルを付ける
for n in np.arange(4):
     ax = fig.add_subplot(2, 2, n+1) # 2x2のサブプロット作成
     if n >= 2:
          plt.xlabel(xlabel) # x軸のラベル(n=2,3で下側のサブプロット)
     if not n % 2: # 0でFalse、1でTrue
          plt.ylabel(ylabel) # y軸のラベル(n=0,2で左側のサブプロット)

直前に操作したサブプロットの情報を取得する

折れ線グラフ

折れ線グラフを描く

Numpyを使って生成した配列を使いcos(x)を作図
import numpy as np
x = np.linspace(-np.pi, np.pi)
plt.plot(x, np.cos(x), color='k')
で黒色の折れ線グラフが描かれる
ax.plot()でも同じ(axはfig.add_subplotの戻り値)

折れ線グラフの色を変える

plt.plot(x, np.cos(x), color='色の名前')
または
plt.plot(x, np.cos(x), c='色の名前')
色の名前は色の名前一覧参照

折れ線グラフの線種を変える

plt.plot(x, np.sin(x), ls='線種')
または
plt.plot(x, np.sin(x), linestyle='線種')
線種の一覧、デフォルト値:'-'(実線)

折れ線グラフの太さを変える

plt.plot(x, np.sin(x), lw=線の太さ)
または
plt.plot(x, np.sin(x), linewidth=線の太さ)
デフォルト値:1、1〜10程度が許容範囲

折れ線グラフのマークを変える

マークの種類はmarker、マーカーの大きさはmarkersize(またはms)で変更

折れ線グラフのマークを塗り潰す

丸印の場合は、マーカーを塗り潰すパターンを変更可能
plt.plot(x, np.cos(x), marker='o', fillstyle='塗り潰しパターン')
塗り潰しパターンはマーカーの塗り潰しパターン一覧参照

階段状のグラフ

デフォルトで折れ線グラフとなっている表示を階段状のグラフに変える
plt.plot(x, np.cos(x), drawstyle=’スタイルの名前’)
または
plt.plot(x, np.cos(x), ds=’スタイルの名前’)

折れ線グラフにx=0、y=0の線を付ける

plt.axhlineで水平方向、plt.axvlineで鉛直方向の線を引く

2つの折れ線グラフの間を塗り潰す

cos(x)とsin(x)の間を塗り潰す
plt.plot(x, np.cos(x), color='k')
plt.plot(x, np.sin(x), color='k')
plt.fill_between(x, np.sin(x), np.cos(x), color='gray', alpha=0.4)
で2つの折れ線グラフの間が灰色で塗り潰される
cos(x)が正の場合に0とcos(x)の間を塗り潰す(不透明度0.4)
*alphaは、0で透明、1で不透明
plt.plot(x, np.cos(x), color='k')
plt.fill_between(x, 0, np.cos(x), where=np.cos(x)> 0, color='gray', alpha=0.4)

折れ線グラフに凡例を付ける

cos(x)とsin(x)を描き、凡例を付ける
plt.plot(x, np.cos(x), color='k', ls='-', label='cos(x)')
plt.plot(x, np.sin(x), color='k', ls='--', label='sin(x)')
で凡例に表示するラベルを設定し、さらに凡例を描くために
plt.legend()
cos(x)が実線、sin(x)が破線であることが凡例として表示される
凡例を調整する方法は凡例参照

折れ線グラフをログスケールで表示する

棒グラフ

棒グラフを描く

plt.bar(x軸のデータ, y軸のデータ)
ax.bar()でも同じ(axはfig.add_subplotの戻り値)

棒グラフを塗り潰す色を変える

plt.bar(x軸のデータ, y軸のデータ, color='色の名前')
色の名前は色の名前一覧参照

棒グラフの枠線の色を変える

plt.bar(x軸のデータ, y軸のデータ, edgecolor='色の名前')
色の名前は色の名前一覧参照

棒グラフを半透明にする

plt.bar(x軸のデータ, y軸のデータ, alpha=数字)
0〜1の範囲で指定する(0で透明、1で不透明)、デフォルト値:1.0

棒グラフの幅を変える

plt.bar(x軸のデータ, y軸のデータ, width=数字)
widthはx軸上の幅で指定する

棒グラフの枠線を変更する

枠線の幅を変更する場合、linewidthまたはlwを用いる
plt.bar(x軸のデータ, y軸のデータ, edgecolor='色の名前', lw=数字)
linewidthのデフォルト値:1
edgecolorの指定がない場合、またはedgecolor='none'の場合、枠線は描かれない 枠線の線種を変更する場合linestyleまたはlsを用いる
plt.bar(x軸のデータ, y軸のデータ, edgecolor='色の名前', ls='文字列')
linestyleのデフォルト値:'-'(実線)

棒グラフを横に並べる

緑色、青、水色の順で横に3つの棒グラフを並べる
plt.bar(x軸のデータ-0.2, y軸のデータ1, color='g', width=0.2)
plt.bar(x軸のデータ, y軸のデータ2, color='b', width=0.2)
plt.bar(x軸のデータ+0.2, y軸のデータ3, color='aqua', width=0.2)
棒の横幅を0.2にして、棒グラフを描く際にx軸の座標を0.2毎ずらしている。棒グラフ同士の間隔を空ける場合には、x軸上でずらす値を大きくする

積み上げ棒グラフを描く

off_y = np.zeros(len(data_y[0])) # 棒グラフの初期開始位置(0)
for n in np.arange(3):
    index = data_y[n].index # x軸上の位置
    plt.bar(index, data_y[n], bottom=off_y) # 棒グラフ積み上げ
    off_y = off_y + data_y[n] # 棒グラフの開始位置再計算

横棒に変える

plt.barh(x軸のデータ, y軸のデータ)

棒グラフに凡例を付ける

plt.bar(x軸のデータ, y軸のデータ, label='ラベル')
で凡例に表示するラベルを設定し、さらに凡例を描くために
plt.legend()
凡例を調整する方法は凡例参照

棒グラフにエラーバーを付ける

エラーバーの書式をerror_kwで与え、エラーバーのデータをyerrで与える。例えば、棒グラフで平均値を、エラーバーで標準偏差を表示する。次は、透明度が0.3、ヒゲのキャップサイズが3の場合
error_config = {'ecolor': '0.3', 'capsize': 3}
plt.bar(x軸のデータ, y軸のデータ, yerr=y軸のエラーバーデータ, error_kw=error_config)
設定可能なものは、ヒゲのキャップサイズ(capsize、整数値のみ、デフォルト値:0)とエラーバーの色や透明度(ecolor、文字列なので0.3ではなく'0.3')、透明度の値は0.0で黒で1.0にかけて徐々に薄い灰色
書式はエラーバーの書式参照

棒グラフ非表示でエラーバーのみにする

color="none"とすると棒グラフを非表示にできる
error_config = {'ecolor': '0.3', 'capsize': 3}
plt.bar(x軸のデータ, y軸のデータ, yerr=y軸のエラーバーデータ, color="none", error_kw=error_config)

棒グラフにハッチを付ける

hatchオプションを使う
plt.bar(x軸のデータ, y軸のデータ, alpha=1.0, hatch='ハッチのパターン', fill=None)
パターンはハッチのパターン参照
棒グラフに色を付ける場合
plt.bar(x軸のデータ, y軸のデータ, alpha=1.0, hatch='ハッチのパターン', fill=True, color='色')

棒グラフの色を正負で塗り分ける

y軸のデータが正の場合に赤、負の場合に青のcolorsリストを作成する
colors = ['r' if d > 0 else 'b' for d in y軸のデータ]
plt.bar(x軸のデータ, y軸のデータ, color=colors, width=幅)

ヒストグラム

ヒストグラムを描く

plt.hist(データ)
ax.hist()でも同じ(axはfig.add_subplotの戻り値)

ヒストグラムを塗り潰す色を変える

plt.hist(データ, color='色の名前')
色の名前は色の名前一覧参照

ヒストグラムの枠線の色を変える

plt.hist(データ, edgecolor='色の名前')
色の名前は色の名前一覧参照

ヒストグラムを半透明にする

plt.hist(データ, alpha=数字)
0〜1の範囲で指定する(0で透明、1で不透明)、デフォルト値:1.0

ヒストグラムにハッチを付ける

plt.hist(データ, hatch='ハッチのパターン', fill=False)
パターンはハッチのパターン参照

ヒストグラムのビンの間隔を設定する

ヒストグラムに凡例を付ける

plt.hist(データ, label='ラベル')
で凡例に表示するラベルを設定し、さらに凡例を描くために
plt.legend()
凡例を調整する方法は凡例参照

ヒストグラムを描く際に合計を1にする

plt.hist(データ, density=True)

2つのヒストグラムを同時に描く

半透明にしたヒストグラムを使い、2つのヒストグラムが重なる部分も判別できるようにする
plt.hist(データ1, color='b', alpha=0.4)
plt.hist(データ2, color='r', alpha=0.4)

ヒストグラムを横に並べる

1つ目のデータを青色、2つ目のデータを赤色で塗り潰す
plt.hist([データ1, データ2], color=['b', 'r'], label=["ラベル1", "ラベル2"])
リストを渡すことができる

積み上げヒストグラムを描く

plt.hist([データ1, データ2], color=['b', 'r'], label=["ラベル1", "ラベル2"], stacked=True)
stacked=Trueを使う。density=Trueと共に使うと、積み上げたものに対する総和が1となる

ヒストグラムと一緒にカーネル密度推定のグラフを描く

plt.hist(データ)
データ.plot(kind='kde')
データはPandasのSeriesかDataFrameにしておく必要あり

散布図

散布図を描く

plt.scatter(x軸データ, y軸データ)
ax.scatter()でも同じ(axはfig.add_subplotの戻り値)

散布図のマーカーの大きさと色を変える

plt.scatter(x軸データ, y軸データ, color='色の名前', s=大きさ)
または
plt.scatter(x軸データ, y軸データ, c='色の名前', s=大きさ)
色の名前は色の名前一覧参照
大きさのデフォルト値はs=36 なお、sオプションのデフォルト値はrcParams['lines.markersize']の設定を参照しており、s=rcParams['lines.markersize']**2のように計算。rcParams['lines.markersize']=6なので、デフォルト値はs=36

散布図のマーカーの種類を変える

plt.scatter(x軸データ, y軸データ, marker='マーカーの名前')
マーカーの名前はマーカーの一覧参照

散布図のマーカーの色を値に応じて変える

z軸データをcオプションに与える
plt.scatter(x軸データ, y軸データ, c=z軸データ)
色の付け方はcmapで指定
plt.scatter(x軸データ, y軸データ, c=z軸データ, cmap='色テーブル')
色テーブルは色テーブルの一覧参照

散布図のマーカーの色をログスケールで変える

デフォルトでは値に応じて色が線形変化するので、matplotlib.colorsのLogNormを使いログスケールで色を変える
from matplotlib.colors import LogNorm
plt.scatter(x軸データ, y軸データ, c=z軸データ, cmap='色テーブル', norm=LogNorm())

散布図にカラーバーを付ける

fig.colorbar(plt.scatterの戻り値)
カラーバーの調整方法については、カラーバー参照
(plt.colorbarと同じオプションを使用可能)

散布図を描く最小値、最大値の範囲を設定する

plt.scatter(x軸データ, y軸データ, vmin=最小値, vmax=最大値)

散布図に複数のデータを同時に描く

1番目のデータを青、2番目のデータを赤で描く
plt.scatter(x軸のデータ1, y軸のデータ2, color='b')
plt.scatter(x軸のデータ1, y軸のデータ2, color='r')

散布図に凡例を付ける

plt.scatter(x軸のデータ, y軸のデータ, label='ラベル')
で凡例に表示するラベルを設定し、さらに凡例を描くために
plt.legend()
凡例を調整する方法は凡例参照

散布図に相関係数を表示する

相関係数はNumpyのcorrcoefを使い計算する(corr[1,0]とcorr[0,1]は、x軸のデータ, y軸のデータの相関係数なのでどちらかを使う)
import numpy as np
corr = np.corrcoef(x軸のデータ, y軸のデータ) # ピアソンの積率相関係数の計算
name = "{s:s}{f:4.3f}".format(s="r = ", f=corr[1, 0]) # 表示するテキスト設定
plt.text(テキストのx座標, テキストのy座標, name, fontsize=14, color='k') # 相関係数を表示
plt.text()でnameに入れた文字列を表示する。

散布図に回帰式を追加する

回帰係数aと切片bを計算し、回帰直線をプロットする
a = corr[1,0] * data_y.std() / data_x.std() # 回帰係数(a)
b = data_y.mean() - a * data_x.mean() # 切片(b)
x1 = np.linspace(np.floor(x軸最小値), np.ceil(x軸最大値), データ数) # x軸データ
y1 = a * x1 + b # y軸データ
plt.plot(x1, y1, color='k', lw=3, label='linear fit') # 回帰式のプロット
np.linspace(最小値, 最大値, データ数)を使い、設定したデータ数分だけのx軸データを生成する
回帰式を表示するには、
name = "{s1:s}{f1:4.3f}{s2:s}{f2:4.3f}".format(s1="y = ", f1=a, s2="x + ", f2=b)
plt.text(テキストのx座標, テキストのy座標, name, fontsize=14, color='k') # 回帰式を表示

矢羽

矢羽を描く

plt.barbs(x軸上の位置, y軸上の位置, 東西風データ, 南北風データ)
ax.barbs()でも同じ(axはfig.add_subplotの戻り値)

矢羽の色を変える

plt.barbs(x軸上の位置, y軸上の位置, 東西風データ, 南北風データ, color='色の名前')
色の名前は色の名前一覧参照

矢羽の長さを変える

矢羽の長さを縦横同時に変える
plt.barbs(x軸上の位置, y軸上の位置, 東西風データ, 南北風データ, length=長さ)
長さのデフォルト値は8

矢羽のスタイルを調整する

設定可能なものは、矢羽を描けないほど風速が小さかった場合に描かれるシンボル(円)の大きさ(emptybarb)、矢羽同士の間隔(spacing)、矢羽の横方向の長さ(height)、旗矢羽の幅(width)
デフォルト値はemptybarb=0.15、spacing=0.12、height=0.4、width=0.25、矢羽の各部分の名称参照

風速の小さい矢羽を描かない

plt.barbs(x軸上の位置, y軸上の位置, 東西風データ, 南北風データ, sizes=dict(emptybarb=0))

矢羽をノットで描く

barb_incrementsで短矢羽5 kt、長矢羽10 kt、旗矢羽50 ktに設定する。
plt.barbs(x軸上の位置, y軸上の位置, 東西風データ, 南北風データ, barb_increments=dict(half=2.57222, full=5.14444, flag=25.7222)
デフォルト値は短矢羽5 m/s、長矢羽10 m/s、旗矢羽50 m/s

矢印

矢印を描く

plt.quiver(x軸上の位置, y軸上の位置, 東西風データ, 南北風データ)
ax.quiver()でも同じ(axはfig.add_subplotの戻り値)

矢印の色を変える

plt.quiver(x軸上の位置, y軸上の位置, 東西風データ, 南北風データ, color='色の名前')
色の名前は色の名前一覧参照

矢印の幅を変える

plt.quiver(x軸上の位置, y軸上の位置, 東西風データ, 南北風データ, width=数字)
幅のデフォルト値は0.005、0.004〜0.006程度が許容範囲

矢印の始点の配置方法

plt.quiver(x軸上の位置, y軸上の位置, 東西風データ, 南北風データ, pivot='位置')
位置は矢印の始点の位置指定参照

矢印の頭の部分の幅や長さを変える

矢印の頭の幅はheadwidth、頭の長さはheadlengthオプションで指定する
デフォルト値はheadwidth=3、headlength=5、矢印の各部分の名称参照 矢印の頭の幅や長さを変えた場合の見た目は矢印の頭の幅矢印の頭の長さ参照

矢印の頭の中心軸部分の長さを変える

矢印の頭の中心軸部分の長さはheadaxislengthで指定、矢印の各部分の名称参照
plt.quiver(x軸上の位置, y軸上の位置, 東西風データ, 南北風データ, headaxislength=数字)
長さのデフォルト値は4.5、矢印の頭の部分の長さheadlengthよりも少し小さい値(headlength − 1程度まで)が許容範囲

等高線

等高線を描く

plt.contour(x軸上の位置, y軸上の位置, z軸データ)
ax.contour()でも同じ(axはfig.add_subplotの戻り値)
x軸上の位置、y軸上の位置は2次元メッシュデータで与える
1次元データ(x, y)から2次元メッシュデータ(X, Y)を作成する場合には
X, Y = np.meshgrid(x, y)

等高線のx、y軸の縦横比を1:1にする

plt.gca().set_aspect('equal')

等高線の色を変える

plt.contour(x軸上の位置, y軸上の位置, z軸データ, colors='色の名前')
colorではなくcolorsなので注意
色の名前は色の名前一覧参照

等高線の幅や線種を変える

等高線の幅はlinewidths、線種はlinestylesで指定(linewidth、linestyleではないので注意)
plt.contour(x軸上の位置, y軸上の位置, z軸データ, linestyles='スタイル', linewidths=数字)
幅のデフォルト値は1、線種のデフォルト値は実線、線種の一覧参照

等高線を描く値を指定する

levelsオプションに等高線を描きたい値のリストを渡す
plt.contour(x軸上の位置, y軸上の位置, z軸データ, levels=等高線を描く値のリスト)

等高線にラベルを付ける

plt.contourの戻り値を使いラベルを付ける
cs = plt.contour(x軸上の位置, y軸上の位置, z軸データ) # 等高線を描く
cs.clabel(fmt="%.1f") # ラベルを付ける
小数点以下第1位まで表示

等高線のラベルを1つ飛ばしに付ける

スライスの記法[::2]を使い、等高線のリストを1つ飛ばしでcs.clabelに渡す
cs = plt.contour(X, Y, Z, colors='k', levels=levels) # 等高線を描く
clevels = cs.levels # 等高線を描いたレベルを取得
cs.clabel(clevels[::2], fmt="%d", fontsize=12) # ラベルを付ける

等高線の色を値に応じて変える

色の付け方はcmapで指定
plt.contour(x軸上の位置, y軸上の位置, z軸データ, cmap='色テーブル')
色テーブルは色テーブルの一覧参照

陰影

陰影を描く

plt.contourf(x軸上の位置, y軸上の位置, z軸データ)
ax.contourf()でも同じ(axはfig.add_subplotの戻り値)
x軸上の位置、y軸上の位置は2次元メッシュデータで与える
1次元データ(x, y)から2次元メッシュデータ(X, Y)を作成する場合には
X, Y = np.meshgrid(x, y)

陰影の色を値に応じて変える

色の付け方はcmapオプションで指定
plt.contourf(x軸上の位置, y軸上の位置, z軸データ, cmap='色テーブル'')
色テーブルは色テーブルの一覧参照

陰影を付ける間隔を変える

levelsオプションに陰影の色を変える値のリストを渡す
plt.contourf(x軸上の位置, y軸上の位置, z軸データ, levels=陰影の色を変える値のリスト)

陰影を変える個数を指定する

levelsオプションに陰影を変える個数を与える
plt.contourf(x軸上の位置, y軸上の位置, z軸データ, levels=陰影の色を変える個数)

陰影を付ける範囲を変更する

陰影のカラースケールの基準となる下限、上限は、それぞれvmin、vmaxオプションで指定
plt.contourf(x軸上の位置, y軸上の位置, z軸データ, vmin=数字, vmax=数字)

陰影にカラーバーを付ける

plt.colorbar()
デフォルトでは縦方向のカラーバーが右側に付けられる カラーバーの調整方法については、カラーバー参照

陰影にハッチを付ける

hatchesオプションを使う
plt.contourf(x軸上の位置, y軸上の位置, z軸データ, hatches='ハッチパターンのリスト')
パターンはハッチのパターン参照

陰影を描く値をログスケールにする

matplotlib.colorsのLogNormを使う
from matplotlib.colors import LogNorm
plt.contourf(x軸上の位置, y軸上の位置, z軸データ,  norm=LogNorm())

陰影を描く範囲をデータ範囲とは異なるものにする

levelsオプションで指定した範囲をデータ範囲より狭くすると範囲外は描かれないため、levelsオプションではデータ範囲を、vmin、vmaxオプションで陰影を描く範囲を指定する。
import matplotlib as mpl
import copy
levels = [-40, -20, -18, -16, -14, -12, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 40]
cmap = mpl.cm.get_cmap("bwr").copy() # 色テーブル取得
cmap.set_under('gray') # 下限を下回った場合に灰色
cmap.set_over('w') # 上限を超えた場合に白
plt.contourf(X, Y, Z, cmap=cmap, levels=levels, vmin=-20, vmax=20)
データ範囲が-40から40、陰影を描く範囲を-20から20とする場合

欠損値を灰色の陰影で塗り潰す

z軸データ(d)の0番目の軸のデータの一部(0からmaskoutの1つ前まで)を欠損にした場合
d[0:maskout,:] = np.nan
plt.contourf(x軸上の位置, y軸上の位置, d)

# 作図範囲の取得
xmin, xmax, ymin, ymax = plt.axis()
xy = (xmin, ymin)
width = xmax - xmin
height = ymax - ymin
# 矩形のパッチを使い、作図範囲の背景色を灰色にする
import matplotlib.patches as patches
p = patches.Rectangle(xy, width, height, fill=True, color='lightgray', zorder=-10)
ax.add_patch(p)
作図範囲の取得については、x軸、y軸の範囲を取得する参照
patches.Rectangleの引数は、開始点の座標、横幅、高さの順
欠損値のデータは透明になるので、背景色を灰色にすると欠損値が灰色で塗り潰される(描く順を最背面にするためzorder=-10を指定)

欠損値の周辺を滑らかにしない

デフォルトでは欠損値の周辺が滑らかに補完される。corner_mask=Falseとすることで角張った形に変わる。
plt.contourf(x軸上の位置, y軸上の位置, z軸データ,  corner_mask=False)

箱ひげ図

箱ひげ図を描く

plt.boxplot(データ)
ax.boxplot()でも同じ(axはfig.add_subplotの戻り値)
デフォルトの箱ひげ図の見方は箱ひげ図参照

箱ひげ図で最小値から最大値までヒゲを描く

ヒゲを描く範囲を決めるwhisオプションをwhis=100のように非常に大きな値にしておく
plt.boxplot(データ, whis=100)
whisオプションのデフォルト値は1.5(箱の1.5倍) 箱ひげ図参照

箱ひげ図に平均値を描く

緑三角で平均値をプロットする
plt.boxplot(データ, showmeans=True)
デフォルト値はFalse(平均値を描かない)

箱ひげ図の平均値のマーカーを変更する

meanpropsオプションに平均値の部分のスタイルを辞書で与える
plt.boxplot(データ, showmeans=True, meanprops=スタイルの辞書)

箱ひげ図でpatch_artistを使う

plt.boxplot(データ, patch_artist=True)
箱ひげ図の見た目が箱ひげ図の各部分と設定の左側のように箱が青色に塗り潰されるスタイルに変わる。

箱ひげ図のヒゲの色や太さを変える

cappropsオプションにヒゲの端のcap部分のスタイルを辞書で与える
plt.boxplot(データ, capprops=スタイルの辞書)
whiskerpropsオプションにヒゲの部分のスタイルを辞書で与える
plt.boxplot(データ, whiskerprops=スタイルの辞書)

箱ひげ図の箱の色や太さを変える

boxpropsオプションに箱の部分のスタイルを辞書で与える
plt.boxplot(データ, boxprops=スタイルの辞書)

箱ひげ図の外れ値のマーカーを変更する

flierpropsオプションに外れ値の部分のスタイルを辞書で与える
plt.boxplot(データ, flierprops=スタイルの辞書)

箱ひげ図の中央値のマーカーを変更する

medianpropsオプションに中央値の部分のスタイルを辞書で与える
plt.boxplot(データ, medianprops=スタイルの辞書)

箱ひげ図のひげの範囲をパーセントで指定する

ヒゲを描く範囲を決めるwhisオプションで最小値、最大値のパーセント点を与える
plt.boxplot(データ, whis=[最小値, 最大値])

箱ひげ図を横に2つ並べる

ヒゲを描くx軸の位置を決めるpositionsオプションを用いる
n = x軸のデータ数
plt.boxplot(データ1, positions=np.arange(0.8, n, 1))
plt.boxplot(データ2, positions=np.arange(1.2, n+1, 1))
*デフォルト値:positions=range(1, N+1)

箱ひげ図の横幅を変更する

箱の横幅を決めるwidthsオプションを用いる

バイオリンプロット

バイオリンプロットを描く

plt.violinplot(データ)
ax.violinplot()でも同じ(axはfig.add_subplotの戻り値)

複数のバイオリンプロットを並べる

3つのデータをプロットする場合
plt.violinplot((データ1, データ2, データ3))
データ配列3つをタプルにして渡す

バイオリンプロットの横幅を変える

widthsオプションを使う(widthではないので注意)
plt.violinplot(データ, widths=幅)
デフォルト値:0.5

バイオリンプロットに中央値を描く

showmediansオプションで中央値を表す横線を描く(True)/描かない(False)を指定
plt.violinplot(データ, showmedians=値)
デフォルト値:False

バイオリンプロットに平均値を描く

showmeansオプションで平均値を表す横線を描く(True)/描かない(False)を指定
plt.violinplot(データ, showmeans=値)
デフォルト値:False

バイオリンプロットに最小値と最大値の範囲を表すヒゲを描く

showextremaオプションで最小値と最大値の範囲を表すヒゲを描く(True)/描かない(False)を指定
plt.violinplot(データ, showextrema=値)
デフォルト値:True

バイオリンプロットのボディを変更する

violin_parts['bodies']の設定を変更する
violin_parts = plt.violinplot(データ, オプション)
for vp in violin_parts['bodies']:
    vp.set_facecolor('b')
    vp.set_edgecolor('k')
    vp.set_linewidth(1)
    vp.set_alpha(0.5)
縁の色を幅1の黒線、ボディの色を半透明(0.5)の青にする
*violin_parts['bodies']はリストになっているので、matplotlib.collections.LineCollectionを取り出したvpに対して設定

バイオリンプロットのパーツを変更する

violin_parts['パーツ名']の設定を変更する
violin_parts = plt.violinplot(データ, オプション)
partnames = ('cbars', 'cmins', 'cmaxes', 'cmedians', 'cmeans')
edgecolors = ('k', 'k', 'k', 'k', 'b')
linestyles = ('-', '-', '-', '-', '--')
linewidths = (1, 1, 1, 1, 1)
for partname, edgecolor, linestyle, linewidth in zip(partnames, edgecolors, linestyles, linewidths):
    vp = violin_parts[partname]
    vp.set_edgecolor(edgecolor)
    vp.set_linestyle(linestyle)
    vp.set_linewidth(linewidth)
ヒゲの縦線(cbars)、最小(cmins)、最大(cmaxes)の横線を幅1の黒実線
中央値の横線(cmedians)を幅1の黒実線、平均値の横線(cmeans)を幅1の青破線
*showextrema=Falseの場合は、cbars、cmins、cmaxesの変更はエラーになる
*showmedians=Falseの場合は、cmediansの変更はエラーになる
*showmeans=Falseの場合は、cmeansの変更はエラーになる

流線関数

流線関数を描く

plt.streamplot(x軸上の位置, y軸上の位置, 東西風, 南北風)
ax.streamplot()でも同じ(axはfig.add_subplotの戻り値)
x軸上の位置、y軸上の位置は2次元メッシュデータで与える
東西風、南北風は2次元の配列
1次元データ(x, y)から2次元メッシュデータ(X, Y)を作成する場合には
X, Y = np.meshgrid(x, y)

流線関数の色を変える

plt.streamplot(x軸上の位置, y軸上の位置, 東西風, 南北風, color='色の名前')
色の名前は色の名前一覧参照

流線関数の間隔や線の幅を変える

流線関数の間隔はdensity、線の幅はlinewidthで指定
plt.streamplot(x軸上の位置, y軸上の位置, 東西風, 南北風, density=数字, linewidth=数字)
densityのデフォルト値は1、linewidthのデフォルト値は1

流線関数の色を値に応じて変える

色の付け方はcmapで指定、色を付ける基準は風速で与える
spd = np.sqrt(東西風**2 + 南北風**2) # 風速
plt.streamplot(x軸上の位置, y軸上の位置, 東西風, 南北風, cmap=plt.cm.'色テーブル')
色テーブルは色テーブルの一覧参照

凡例

凡例を付ける

plt.legend()
ax.legend()でも同じ(axはfig.add_subplotの戻り値)

凡例の位置を変える

凡例の位置は凡例の位置参照

凡例をグラフの外側に出す

plt.legend(loc='upper left', bbox_to_anchor=(1.05, 1.1), borderaxespad=0)
図全体の右側、上側にアンカーを設定:bbox_to_anchor=(1.05, 1.1)
凡例の左上がちょうどアンカーの位置にくるように、loc='upper left'、borderaxespad=0とした

凡例の枠線を丸くしない

凡例の枠を角張った四角形に変える場合
plt.rcParams["legend.fancybox"] = False

凡例の不透明度を変える

plt.rcParams["legend.framealpha"] = 数字
0〜1の範囲で指定する(0で透明、1で不透明)、デフォルト値:0.8

凡例の枠線の色を変える

plt.rcParams["legend.edgecolor"] = 数字または色の名前
デフォルト値:0.8
数字の場合は、透明度を'0'〜'1'の範囲で指定する('0'で不透明、'1'で透明、数字の場合も文字列として指定)
色の名前は色の名前一覧参照

凡例の枠内を塗り潰す色を変える

plt.rcParams["legend.facecolor"] = 色の名前
色の名前は色の名前一覧参照

凡例の枠を描かない

凡例内の線を長くする

plt.legend(handlelength=3)
*デフォルト値:handlelength=2

凡例内の文字の色を変える

plt.legend(labelcolor='数字または色の名前')
色の名前は色の名前一覧参照

凡例内の線を任意に設定する

Line2Dでカスタムラインを設定する
from matplotlib.lines import Line2D
custom_lines = [
    Line2D([0], [0], color='tab:blue', lw=4), # 青線
    Line2D([0], [0], color='tab:orange', lw=4), # オレンジ線
    Line2D([0], [0], color='tab:red', lw=4) # 赤線
]
fig, ax = plt.subplots()
# 凡例を描く
ax.legend(custom_lines, ['Low', 'Medium', 'High']) # 青、オレンジ、赤の順に並ぶ

凡例にマーカーやパッチを設定する

Line2D、Patchでマーカーやパッチを設定する
from matplotlib.lines import Line2D
custom_lines = [
    Line2D([0], [0], color='tab:blue', lw=4), # 青線
    Line2D([0], [0], marker='o', markersize=8, color='tab:orange', lw=0), # オレンジ丸マーカー
    Patch(facecolor='red', edgecolor='k', hatch='//',  lw=1) # 赤塗りの黒枠に射線のハッチ
]
fig, ax = plt.subplots()
# 凡例を描く
ax.legend(custom_lines, ['Low', 'Medium', 'High']) # 青、オレンジ、赤の順に並ぶ

カラーバー

カラーバーを付ける

plt.colorbar()
デフォルトでは縦方向のカラーバーが右側に付けられる(orientation='vertical')

カラーバーを横にする

plt.colorbar(orientation='horizontal')
横方向のカラーバーが下側に付く

カラーバーにラベルを付ける

plt.colorbarの戻り値cbarを使いラベルを付ける
cbar = plt.colorbar() # カラーバーを描く
cbar.set_label('文字列') # カラーバーにラベルを付ける

カラーバーの目盛り線ラベルの書式を変える

cbar = plt.colorbar(format="書式") # 目盛り線ラベルの書式設定してカラーバーを描く
cbar.set_label('文字列') # カラーバーにラベルを付ける

カラーバーの大きさを変える

plt.colorbar(shrink=サイズ)
デフォルト値:1.0

カラーバーと図枠との間隔を変える

plt.colorbar(pad=間隔)

カラーバーの小目盛りを消す/付ける

カラーバーの目盛り線を付ける間隔を変更する

カラーバーの目盛り線の設定を変更する
import matplotlib.ticker as ticker
cbar = plt.colorbar(オプション)
cbar.ax.yaxis.set_major_locator(ticker.目盛り線の設定) # 縦方向カラーバーの大目盛り
cbar.ax.yaxis.set_minor_locator(ticker.目盛り線の設定) # 縦方向カラーバーの小目盛り

カラーバーの目盛り線ラベルに任意の文字列を付ける

plt.colorbar(ticks=[目盛り線を描く値のリスト], orientation='カラーバーの向き')

テキスト

テキストをプロットする

plt.text(x軸の座標, y軸の座標, テキスト)
ax.text()でも同じ(axはfig.add_subplotの戻り値)

テキストの文字サイズを変える

plt.text(x軸の座標, y軸の座標, テキスト, fontsize=文字の大きさ )
文字の大きさはポイントか文字列で与える。文字のサイズと大きさ参照

テキストの書体を変える

plt.text(x軸の座標, y軸の座標, テキスト, fontstyle='字体')
字体は'normal'、'italic'、oblique、デフォルト値:'normal'

テキストの色を変更する

plt.text(x軸の座標, y軸の座標, fontweight='色の名前'')
色の名前は色の名前一覧参照

テキストの文字の太さを変える

plt.text(x軸の座標, y軸の座標, color='文字の太さ')
文字の太さは文字のサイズと大きさ参照

テキストの文字列の水平位置と鉛直位置を指定する

plt.text(x軸の座標, y軸の座標, ha='位置', va='位置')
文字列の位置は文字列の位置参照
haはhorizontalalignment、vaはverticalalignmentの省略形

テキストの文字列を回転させる

plt.text(x軸の座標, y軸の座標, rotation=角度)

アニメーション

アニメーションを作成

matplotlib.animationを使い、複数の作図時の戻り値をまとめる
import matplotlib.animation as animation
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
imgs = [] # リストを作成
for t in np.arange(開始, 終了, 間隔):
    何らかの処理
    img = plt.plot(x, y, オプション) # 時刻tの(x, y)折れ線グラフ
    imgs.append(img) # 戻り値をリストに追加

# アニメーション作成
anim = animation.ArtistAnimation(fig, imgs)
anim.save('ファイル名.gif', writer='pillow')  # gifで書き出す場合
anim.save('ファイル名.mp4', writer='ffmpeg') # mp4で書き出す場合 

複数のグラフを重ねる

同時刻の複数のグラフを同じサブプロットに描く場合
import matplotlib.animation as animation
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
imgs = [] # リストを作成
for t in np.arange(開始, 終了, 間隔):
    何らかの処理
    img1 = plt.plot(x, y1, オプション) # 時刻tの(x, y1)折れ線グラフ
    img2 = plt.plot(x, y2, オプション) # 時刻tの(x, y2)折れ線グラフ
    imgs.append(img1 + img2) # 複数の戻り値をまとめてリストに追加

# アニメーション作成
anim = animation.ArtistAnimation(fig, imgs)

複数のサブプロットで同時に描く

複数のサブプロットで行った描画の戻り値をまとめる
import matplotlib.animation as animation
fig = plt.figure()
ax1 = fig.add_subplot(1, 2, 1) # サブプロット1
ax2 = fig.add_subplot(1, 2, 1) # サブプロット2
imgs = [] # リストを作成
for t in np.arange(開始, 終了, 間隔):
    何らかの処理
    img1 = ax1.plot(x1, y1, オプション) # 時刻tの(x1, y1)折れ線グラフ
    img2 = ax2.plot(x2, y2, オプション) # 時刻tの(x2, y2)折れ線グラフ
    imgs.append(img1 + img2) # 複数の戻り値をまとめてリストに追加

# アニメーション作成
anim = animation.ArtistAnimation(fig, imgs)

軸の体裁

x軸、y軸ラベルの大きさや色を変更する

plt.titleと同じオプションが使える

x軸、y軸の目盛り線の書式

tickerを使い、大目盛りと小目盛りを自動設定
import matplotlib.ticker as ticker
ax.xaxis.set_major_locator(ticker.AutoLocator()) # x軸大目盛り
ax.xaxis.set_minor_locator(ticker.AutoMinorLocator()) # x軸小目盛り
ax.xaxis.set_major_locator(ticker.AutoLocator()) # y軸大目盛り
ax.xaxis.set_minor_locator(ticker.AutoMinorLocator()) # y軸小目盛り
axはサブプロットを作成した際の戻り値

x軸、y軸の目盛り線の間隔を変更する

x軸の目盛り線の設定(ax.xaxis)、y軸の目盛り線の設定(ax.yaxis)を変更
axはサブプロットを作成した際の戻り値

目盛り線とラベルを任意の場所に付ける

ax.set_xticks、ax.set_xticklabelsを使い、x軸の任意の場所に目盛り線とラベルを付ける
ax.set_xticks([目盛り線の値のリスト]) # 目盛り線
ax.set_xticklabels([ラベルのリスト]) # 目盛り線のラベル
axはサブプロットを作成した際の戻り値
ax.set_xticksを使う場合、ax.xaxis.set_major_locatorは設定しない

x軸、y軸の目盛り線ラベルの文字サイズを変更する

plt.rcParamsの設定を変更する

x軸の目盛り線ラベルの文字列を回転させる

xticklabelsの書式を変更する
import matplotlib.ticker as ticker
ax.xaxis.set_major_locator(ticker.FixedLocator(ax.get_xticks().tolist()))
ax.set_xticklabels(ax.get_xticklabels(), rotation=70, size="small")
axはサブプロットを作成した際の戻り値
自動的にx軸ラベルの表記を斜めにするには次のようにする
plt.gcf().autofmt_xdate()

x軸、y軸の範囲を指定する

x軸、y軸の範囲を取得する

x軸の範囲をxmin、xmax、y軸の範囲をymin、ymaxに入力
xmin, xmax, ymin, ymax = plt.axis()

小目盛り線を付ける/消す

plt.rcParamsの設定を変更する

x軸、y軸目盛り線を内側にする

plt.rcParams['xtick.direction'] = 'in' # x軸目盛り線を内向き
plt.rcParams['ytick.direction'] = 'in' # y軸目盛り線を内向き
デフォルト:plt.rcParams['xtick.direction'] = 'out'(外向き)

目盛り線の長さを変える

plt.rcParams['xtick.major.size'] = 8 # x軸大目盛り線の長さ
plt.rcParams['ytick.major.size'] = 8 # y軸大目盛り線の長さ
plt.rcParams['xtick.minor.size'] = 4 # x軸小目盛り線の長さ
plt.rcParams['ytick.minor.size'] = 4 # y軸小目盛り線の長さ

目盛り線の幅を変える

plt.rcParams['xtick.major.width'] = 1.2 # x軸大目盛り線の幅
plt.rcParams['ytick.major.width'] = 1.2 # y軸大目盛り線の幅
plt.rcParams['xtick.minor.width'] = 0.8 # x軸小目盛り線の幅
plt.rcParams['ytick.minor.width'] = 0.8 # y軸小目盛り線の幅

目盛り線の色を変える

plt.rcParams['xtick.color'] = 'b'  # x軸を青色
plt.rcParams['ytick.color'] = 'r'  # y軸を赤色

図の時間軸の表示を調整する

matplotlib.datesを使い、主目盛り線ラベルの時刻表記を変える
import matplotlib.dates as mdate
ax.xaxis.set_major_formatter(mdates.DateFormatter('時刻表記の書式'))
時刻表記の書式については時刻表記に用いられる書式指定子一覧参照

目盛り線を付ける場所を変える際も、matplotlib.datesを使うことが可能(x軸、y軸の目盛り線の間隔を変更する参照)
import matplotlib.dates as mdate
ax.xaxis.set_major_formatter(mdates.MonthLocator(interval=6))
ax.xaxis.set_minor_formatter(mdates.MonthLocator(interval=1))
主目盛り線を6ヶ月間隔、副目盛り線を1ヶ月間隔で付ける

x軸の時刻を描く範囲を指定する場合
from datetime import datetime
stime = '2018-01-01'
etime = '2024-12-31'
x_min = datetime.strptime(stime, '%Y-%m-%d')
x_max = datetime.strptime(etime, '%Y-%m-%d')
ax.xlim([x_min, x_max])
x軸の範囲をstimeからetimeまでに設定する

軸の上下、左右を逆転させる

y軸をログスケールにした時にラベルの数字を整数表示する

matplotlib.tickerに含まれるLogLocatorとFuncFormatterを使う

y軸の目盛り線ラベルをパーセント表示にする

matplotlib.tickerに含まれるPercentFormatterを使う
import matplotlib.ticker as ticker
ax.yaxis.set_major_formatter(ticker.PercentFormatter(1.0))
0〜1が0%〜100%の表記に変わる

y軸の目盛り線ラベルを指数表記にする

値が大きい/小さい場合、指数表記m×10nのうちmの部分がy軸の目盛り線ラベルに、10nの部分がy軸の上に表示される。y軸の目盛り線ラベルを指数表記にするには、matplotlib.tickerに含まれるFuncFormatterを用いる。
import matplotlib.ticker as ticker
def major_formatter(x, pos):
    if x == 0:
        return "%.0f" % x
    else:
        return "%.0e" % x
ax.yaxis.set_major_formatter(ticker.FuncFormatter(major_formatter))
*0の目盛り線ラベルは、指数表記ではなく0と表示されるように調整
*小数第一位まで表示するには、"%.0e"を"%.1e"に変更する

軸の体裁を一括設定する

ax.setを使う(axはサブプロットを作成した際の戻り値)

図の体裁

全体のフォントをまとめて指定する

plt.rcParams["font.family"] = "Times New Roman"
Times New Romanに変更

全体の文字サイズをまとめて指定する

12ポイントに設定する(デフォルト値:10ポイント)
plt.rcParams["font.size"] = 12

タイトルの文字サイズや色を変更する

タイトルや軸ラベル、テキストのフォントを指定する

fontfamilyオプションでTimes New Romanに変更する場合

マーカーや線を重ねる順序を調整する

zorder=整数、で数字が大きい方を後に描く
plt.scatter(xデータ1, yデータ1, zorder=2) # 散布図を上に
plt.plot(xデータ2, yデータ2, zorder=1) # 折れ線グラフを下に

グリッド線を引く

plt.grid()

グリッド線を背面に表示する

グリッド線がグラフの前面に来た場合は、ax.set_axisbelowで背面に移動する
ax.set_axisbelow(True)
Trueでzorder = 0.5になる、デフォルト値は"line"(zorder = 1.5)
グラフのzorderを0.5未満に設定した場合は、この設定を行ってもグリッド線がグラフの前面に表示される

図の枠線や目盛りを消す

図の枠線の幅を変える

枠線の幅を太くする(デフォルト値:1.0)
plt.rcParams["axes.linewidth"] = 1.5
[top]