matplotlib:グラフ作図のTIPS
作成者:山下陽介(国立環境研究所)
目次
- 軸の体裁
- x軸、y軸ラベルの大きさや色を変更する
- x軸、y軸の目盛り線の書式
- x軸、y軸の目盛り線の間隔を変更する
- 目盛り線とラベルを任意の場所に付ける
- x軸、y軸の目盛り線ラベルのサイズを変更する
- x軸の目盛り線ラベルの文字列を回転させる
- x軸、y軸の範囲を指定する
- x軸、y軸の範囲を取得する
- 小目盛り線を付ける/消す
- x軸、y軸目盛り線を内側にする
- 目盛り線の長さを変える
- 目盛り線の幅を変える
- 目盛り線の色を変える
- 図の時間軸の表示を調整する
- 軸の上下、左右を逆転させる
- y軸をログスケールにした時にラベルの数字を整数表示する
- y軸の目盛り線ラベルをパーセント表示にする
- y軸の目盛り線ラベルを指数表記にする
- 軸の体裁を一括設定する
matplotlibの基本
IPython上での操作方法
IPython上でpythonを使用する
- IPythonを起動する
% ipython --pylab
でIPythonをpylabモードで起動する(%はコマンドプロンプト) - IPythonの終了方法
quit()
Jupyter Notebook上での操作方法
Webブラウザ上でpythonを使用する
- Jupyter Notebookを起動する
% jupyter notebook
で起動する(%はコマンドプロンプト)
バージョンを指定する場合、jupyter-3.12 notebook
3.12の部分は起動したいバージョン - Jupyter Notebookの終了方法
Ctrl+C
- Windowsの場合
Anaconda NavigatorからJupyter Notebookを起動する
anaconda_promptからjupyter notebookでも起動可能
matplotlibのモジュール
matplotlib.pyplotモジュールをインポートする
import matplotlib.pyplot as plt以降はpltとして参照できる
画面上に表示する
pythonスクリプトをコマンドラインで実行し画面上に表示したい場合、スクリプトの最後を次のようにする
Jupyter Notebook上で作図する場合は不要
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にも対応)
- 解像度を300 dpiに変えるには(デフォルト値:100)
plt.savefig("ファイル名", dpi=300)
- 周囲の余白を少なくするには
plt.savefig("ファイル名", bbox_inches='tight')
- 周囲の余白を完全に無くす場合
plt.savefig("ファイル名", bbox_inches='tight', pad_inches=0.0)
matplotlibのデフォルト設定rcParamsを表示する
- IPython上やJupyter Notebook上
plt.rcParams
- スクリプト内
print(plt.rcParams)
モジュールのimportでエラーが出る場合
MacPortsでpythonをインストールした場合
- pythonをバージョン指定して起動(3.12の場合)
% python3.12 import モジュール名
*モジュールを導入したバージョンで起動し、import可能か確認する - デフォルトのpythonバージョンを確認
% python
*最初の行にバージョンが表示される - デフォルトバージョンを変更(MacPortsで3.12に変える場合)
% sudo port select --set python3 python312 % sudo port select --set python python312
python3、pythonどちらでも3.12が起動する
- スクリプト中にpythonのパスを追加
import sys sys.path.append(os.pardir)
*上位ディレクトリのパスを追加 - 環境変数で追加する場合
export PYTHONPATH=モジュールを置いた場所へのパス
matplotlib作図スクリプトの基本
Pythonスクリプト
sample.pyのようなファイル名で作成する
- スクリプトの最初の行(shebang:シバン、シェバン)
#!/usr/bin/env python3
*現在の環境で設定されているpython3が起動される
cron等で実行する際には、次のようにインタプリタの絶対パスを記載する#!/opt/local/bin/python3.12
*MacPortsでインストールしたpython3.12が起動される
*指定したパスに存在しなければエラー - スクリプトの最初で、必要なモジュールをまとめてインポートする
import matplotlib.pyplot as plt import pandas as pd # Pandas import numpy as np # Numpy
matplotlib.pyplotについては、matplotlibのモジュール参照
Pythonスクリプトの実行方法
- スクリプトをコマンドラインから直接実行する場合
% ./スクリプト名.py
最初の行(shebang)が適切に設定されている必要がある - pythonコマンドを使って実行する場合
% python スクリプト名.py
(%はコマンドプロンプト)
スクリプト実行時のWarning表示を消す
- register matplotlib convertersの警告を消す
from pandas.plotting import register_matplotlib_converters register_matplotlib_converters()
- More than 20 figures have been openedの警告を消す
matplotlib.rcParams['figure.max_open_warning'] = 0
同じスクリプトで複数の図を連続作成している場合などに発生
不要なら、警告を消すよりも作図後にplt.close()を行なった方が良い - .ix is deprecatedの警告が出る場合(.loc、.ilocに書き換える)
- 番号のみで記述していた場合
df.ix[0, :]なら、df.iloc[0, :]
- ラベルのみで記述していた場合
df.ix[:, "A"]なら、df.loc[:, "A"]
- 番号とラベルが混在するものをラベルで
df.ix[[0, 2], "A"]なら、df.loc[df.index[[0, 2]], "A"]
- 番号とラベルが混在するものを番号で
df.ix[[0, 2], "A"]なら、df.iloc[[0, 2], df.columns.get_loc("A")] df.ix[[0, 2], ["A", "B"]なら、df.iloc[[0, 2], df.columns.get_indexer(["A", "B"])]
- 番号のみで記述していた場合
- MatplotlibDeprecationWarning: You are modifying the state of a globally registered colormap.の警告が出る場合
- matplotlib 3.7以降、mpl.colormaps.get_cmapを使う場合
import matplotlib as mpl import copy cmap = copy.copy(mpl.colormaps.get_cmap("色テーブル")) ・・・(カラーマップの変更)
カラーマップをコピーしてから変更する - matplotlib 3.7以降、mpl.colormapsを使う場合
import matplotlib as mpl import copy cmap = copy.copy(mpl.colormaps["色テーブル"])
- matplotlib 3.6までは警告が出なかった方法(非推奨、3.9以降でエラー)
import matplotlib as mpl import copy cmap = copy.copy(mpl.cm.get_cmap["色テーブル"])
*3.6まではmpl.cm.get_cmapが使えたが、3.7ではMatplotlibDeprecationWarningが出るようになった
- matplotlib 3.7以降、mpl.colormaps.get_cmapを使う場合
- xticklabelsでUserWarning: FixedFormatter should only be used together with FixedLocatorの警告が出る場合
- 変更前
ax.set_xticklabels(ax.get_xticklabels(), rotation=70, size="small")
- 変更後(先にFixedLocatorを使う)
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")
- 変更前
- pandasの文字列置換でregexの警告が出る場合
python3.9では、次のような警告が出るようになるFutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will *not* be treated as literal strings when regex=True.
- 変更前
df.iloc[:, i].str.replace("文字列", "置換する文字列")
dfはpandasのDataFrame - 変更後(regex=Trueのオプションを付ける)
df.iloc[:, i].str.replace("文字列(正規表現を含む)", "置換する文字列", regex=True)
axis=1の0番目の要素を全て置き換える
文字列に正規表現を含む場合はregex=Trueが必須 - 変更後(文字列のみならregex=Falseでもよい)
df.iloc[:, 0].str.replace("文字列(正規表現を含まない)", "置換する文字列", regex=False)
axis=1の0番目の要素を全て置き換える
- 変更前
- pcolorで警告が出る場合
matplotlib 3.3以降、pcolorでshadingオプションの警告が出るようになった(3.5以降ではエラーとなる)- 変更前
plt.pcolor(x, y, d, cmap='jet')
x, y, dは2次元のndarray - 変更後(shading='auto'のオプションを付ける)
plt.pcolor(x, y, d, cmap='jet', shading='auto')
- 変更前
- pandasでSettingWithCopyWarningの警告が出る場合
元のDataFrameから切り出したスライスを変更する場合に警告が出る。コピーを用いる。- 変更前
doy = df.loc[:, "doy"] doy[doy > 300] = np.nan
dfはDataFrame - 変更後(copy()を使う)
doy = df.loc[:, "doy"].copy() doy[doy > 300] = np.nan
- 変更前
Pythonプログラムの文法チェックとインデント合わせ
スクリプト実行前にyapfコマンドを実行すると、文法エラーがある場合には出力し、PEP8に準拠する4文字のインデント合わせと見た目の調整を自動で行ってくれる。flake8を使うと、PEP8から外れたものを表示してくれる。
- yapf
- yapfの取得
sudo port install py311-yapf
py311の部分はpythonのバージョンによって変わる - yapfコマンドの実行(ファイルを変更する場合)
% yapf -i スクリプト名.py
(%はコマンドプロンプト)
*文法エラーがある場合には、実行を中断してエラーを表示する - yapfコマンドの実行(変更点を表示しファイルは変更しない)
% yapf -d スクリプト名.py
- yapfの取得
- flake8
- flake8の取得
sudo port install py311-flake8
py311の部分はpythonのバージョンによって変わる - flake8コマンドの実行
% flake8 スクリプト名.py
*表示された部分を必要に応じて手動修正する - 1行の文字数を79文字から変更する
% flake8 --max-line-length=文字数 スクリプト名.py
*指定した文字数で修正提案が出るようになる
- flake8の取得
pythonプログラムをhtmlで表示
pygmentを使うと、ソースコードをhtmlで綺麗に表示することができる
- pygmentの取得
sudo port install py312-pygments
py312の部分はpythonのバージョンによって変わる - pygmentizeコマンドの実行
% pygmentize -f html -l python -O full -o スクリプト名.html スクリプト名.py
(%はコマンドプロンプト)
サブプロット
プロットエリアの作成
- サイズを指定しない場合
fig = plt.figure()
- サイズを指定する場合
fig = plt.figure(figsize=(縦幅, 横幅))
- 例:縦横比6:3
fig = plt.figure(figsize=(6, 3))
サブプロットの作成
ax = fig.add_subplot(1, 1, 1)戻り値の軸(サブプロット)axは、matplotlib.pyplotやインポートした際に設定する別名のpltに相当し、pltの代わりにaxでも作図メソッドを利用できる。
プロットエリアの作成とサブプロットの作成を同時に行うこともできる
- サイズを指定しない場合
fig, ax = plt.subplots(111)
- サイズを指定する場合(縦横比6:3)
fig, ax = plt.subplots(111, figsize=(6, 3))
複数のサブプロットを並べる
ax = fig.add_subplot(縦に並べる数, 横に並べる数, 番号)
- 縦に2つ並べる
ax1 = fig.add_subplot(2, 1, 1) ax2 = fig.add_subplot(2, 1, 2)
- 縦に2つ、横に2つ並べる
ax1 = fig.add_subplot(2, 2, 1) ax2 = fig.add_subplot(2, 2, 2) ax3 = fig.add_subplot(2, 2, 3) ax4 = fig.add_subplot(2, 2, 4)
- プロットエリアの作成とサブプロットの作成を同時
fig, ax = plt.subplots(nrows=縦に並べる数, ncols=横に並べる数)
- 縦に3つ、横に2つ並べる
fig, ax = plt.subplots(nrows=3, ncols=2)
軸(サブプロット)axにはax[0][0]のようにアクセス
1番目が縦の番号(ここでは0〜2)、2番目が横の番号(ここでは0〜1) - 図のサイズを指定することも可能
fig, ax = plt.subplots(nrows=3, ncols=2, figsize=(8, 8))
- 縦に3つ、横に2つ並べる
サブプロットにタイトルを付ける
サブプロットにx軸、y軸のラベルを付ける
- x軸のラベルをつける
plt.xlabel("ラベル")
- y軸のラベルをつける
plt.ylabel("ラベル")
- axを使う場合(axはサブプロットを作成した際の戻り値)
ax.set_xlabel("ラベル") ax.set_ylabel("ラベル")
複雑なサブプロットの配置
GridSpecを使う
複数のサブプロットに1つのタイトルを付ける
- 枠線を消してからタイトルを付ける方法
plt.axis('off') plt.title("タイトル")
この後で複数のサブプロットを作成すれば、図枠の一番上のタイトルになる - 複数のサブプロット作成後にfig.suptitleを使う方法
fig.suptitle("タイトル")
サブプロットの中に別のサブプロットを配置
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()オプションの一覧は、プロット範囲の調整参照
- 例:水平スペースを8割の大きさ、下に2割の空き
plt.subplots_adjust(hspace=0.8, bottom=0.2)
- 例:水平スペースを狭くする場合(5割)
plt.subplots_adjust(hspace=0.5, bottom=0.2)
- 例:図枠内を広く使用する場合(top、bottom、left、rightで指定)
plt.subplots_adjust(top=0.85, bottom=0.15, left=0.1, right=0.9)
- 例:左右のサブプロットのy軸同士、上下のサブプロットのx軸同士を結合して表示したい場合
plt.subplots_adjust(wspace=0.0, hspace=0.0)
- 例:さらに図枠全体まで使う場合
plt.subplots_adjust(top=1.0, bottom=0.0, left=0.0, right=1.0, wspace=0.0, hspace=0.0)
複数のサブプロットを配置した時の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で左側のサブプロット)
直前に操作したサブプロットの情報を取得する
- 直前に操作した図(プロットエリア)の情報を取得する
gcf = plt.gcf()
gcf (get current figure) - 直前に操作した軸(サブプロット)の情報を取得する
gca = plt.gca()
gca (get current axes)
折れ線グラフ
折れ線グラフを描く
Numpyを使って生成した配列を使いcos(x)を作図
ax.plot()でも同じ(axはfig.add_subplotの戻り値)
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.cos(x), color='r')
- どうしても自分で色を作りたい場合
plt.plot(x, np.cos(x), color='#d62728')
'#rrggbb'の書式でRGBの0〜255の値を2桁の16進数で入力
折れ線グラフの線種を変える
plt.plot(x, np.sin(x), ls='線種')または
plt.plot(x, np.sin(x), linestyle='線種')線種の一覧、デフォルト値:'-'(実線)
- 例:破線を描く:
plt.plot(x, np.sin(x), linestyle='--')
- 例:線の代わりに丸印のマーカーを付ける:
plt.plot(x, np.sin(x), linestyle='', marker='o')
またはplt.plot(x, np.sin(x), linestyle='none', marker='o')
マーカーについては、折れ線グラフのマークを変える参照
折れ線グラフの太さを変える
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='マーカーの名前')
マーカーの名前は指定可能なマーカーの一覧参照 - 丸印のマーカーを大きくする:
plt.plot(x, np.cos(x), marker='o', markersize=8)
またはplt.plot(x, np.cos(x), marker='o', ms=8)
markersizeのデフォルト値:6
折れ線グラフのマークを塗り潰す
丸印の場合は、マーカーを塗り潰すパターンを変更可能
plt.plot(x, np.cos(x), marker='o', fillstyle='塗り潰しパターン')塗り潰しパターンはマーカーの塗り潰しパターン一覧参照
階段状のグラフ
デフォルトで折れ線グラフとなっている表示を階段状のグラフに変える
階段状(後側):
階段状(中央):
plt.plot(x, np.cos(x), drawstyle=’スタイルの名前’)または
plt.plot(x, np.cos(x), ds=’スタイルの名前’)
- 折れ線グラフ(デフォルト):
plt.plot(x, np.cos(x), drawstyle=’default’)
- 階段状(前側):
plt.plot(x, np.cos(x), drawstyle=’steps-pre’)
または
plt.plot(x, np.cos(x), drawstyle=’steps’)
plt.plot(x, np.cos(x), drawstyle=’steps-post’)
plt.plot(x, np.cos(x), drawstyle=’steps-mid’)
折れ線グラフにx=0、y=0の線を付ける
plt.axhlineで水平方向、plt.axvlineで鉛直方向の線を引く
- x=0の線を付ける(黒の破線)
plt.axvline(x=0, color='k', ls='--')
- y=0の線を付ける(黒の破線)
plt.axhline(y=0, color='k', ls='--')
2つの折れ線グラフの間を塗り潰す
cos(x)とsin(x)の間を塗り潰す
cos(x)が正の場合に0とcos(x)の間を塗り潰す(不透明度0.4)
*alphaは、0で透明、1で不透明
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)が破線であることが凡例として表示される
凡例を調整する方法は凡例参照
折れ線グラフをログスケールで表示する
- 図をプロットした後、軸のスケールを変更する場合
- x軸を対数グラフ
ax.set_xscale("log")
- y軸を対数グラフ
ax.set_yscale("log")
- x軸を対数グラフ
- 片対数グラフ、両対数グラフを描くメソッドもある
- x軸を対数グラフ
plt.semilogx(x, y)
- y軸を対数グラフ
plt.semilogy(x, y)
- 両対数グラフ
plt.loglog(x, y)
- 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, np.cos(x), alpha=0.4, color='r', edgecolor=0.4)
棒グラフの幅を変える
plt.bar(x軸のデータ, y軸のデータ, width=数字)widthはx軸上の幅で指定する
棒グラフの枠線を変更する
枠線の幅を変更する場合、linewidthまたはlwを用いる
edgecolorの指定がない場合、またはedgecolor='none'の場合、枠線は描かれない
plt.bar(x軸のデータ, y軸のデータ, edgecolor='色の名前', lw=数字)linewidthのデフォルト値:1
edgecolorの指定がない場合、またはedgecolor='none'の場合、枠線は描かれない
- 枠線の幅を太くする(幅2の黒線)
plt.bar(x軸のデータ, y軸のデータ, edgecolor='k', lw=2)
- 枠線の幅を細くする(幅0.5の黒線)
plt.bar(x軸のデータ, y軸のデータ, edgecolor='k', lw=0.5)
plt.bar(x軸のデータ, y軸のデータ, edgecolor='色の名前', ls='文字列')linestyleのデフォルト値:'-'(実線)
- 枠線を破線にする
plt.bar(x軸のデータ, y軸のデータ, edgecolor='k', ls='--')
線種の一覧参照
棒グラフを横に並べる
緑色、青、水色の順で横に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軸のデータ)
棒グラフに凡例を付ける
棒グラフにエラーバーを付ける
エラーバーの書式を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にかけて徐々に薄い灰色
書式はエラーバーの書式参照
- 例:キャプサイズを長くする
error_config = {'ecolor': '0.3', 'capsize': 6}
- 例:黒色で不透明
error_config = {'ecolor': '0.0', 'capsize': 3}
- 例:水色に変える
error_config = {'ecolor': 'c', 'capsize': 3}
棒グラフ非表示でエラーバーのみにする
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(データ, alpha=0.4, fill=False, hatch='//')
- 例:黒色の枠線にハッチ、青色で塗り潰す、半透明
plt.hist(データ, color='b', alpha=0.4, fill=True, hatch='++')
ヒストグラムのビンの間隔を設定する
- 自動設定(デフォルト値)
plt.hist(データ, bins='auto')
- ビンの数を指定する
plt.hist(データ, bins='auto')
データの最小値と最大値からビンの幅が自動設定される - ビンの間隔を手動で設定する
ビンの端点の値をedgesとして与える
edges = np.arange(開始点, 終了点, 間隔) # ビンの端点の設定 plt.hist(データ, bins=edges)
x軸の範囲を同時に指定して開始点、終了点と合わせた方が良い
ヒストグラムに凡例を付ける
ヒストグラムを描く際に合計を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
- 色を赤、大きさを6(プロットする数が多い場合は、値を小さくする)
plt.scatter(x軸データ, y軸データ, color='k', s=6)
散布図のマーカーの種類を変える
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の戻り値)
- 例:丸に青系の色を付けて、カラーバーを表示
cs=plt.scatter(x軸データ, y軸データ, c=z軸データ, marker='o', s=24, cmap='Blues', edgecolor='k') fig.colorbar(cs)
- 例:カラーバーを横にする
fig.colorbar(cs, orientation='horizontal')
(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')
散布図に凡例を付ける
散布図に相関係数を表示する
相関係数は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, u, v, color='b')
- 色を青色、緑色と交互に変える
plt.barbs(x, y, u, v, barbcolor=['b', 'g'])
矢羽の長さを変える
矢羽の長さを縦横同時に変える
plt.barbs(x軸上の位置, y軸上の位置, 東西風データ, 南北風データ, length=長さ)長さのデフォルト値は8
矢羽のスタイルを調整する
設定可能なものは、矢羽を描けないほど風速が小さかった場合に描かれるシンボル(円)の大きさ(emptybarb)、矢羽同士の間隔(spacing)、矢羽の横方向の長さ(height)、旗矢羽の幅(width)
デフォルト値はemptybarb=0.15、spacing=0.12、height=0.4、width=0.25、矢羽の各部分の名称参照
デフォルト値はemptybarb=0.15、spacing=0.12、height=0.4、width=0.25、矢羽の各部分の名称参照
- emptybarbをデフォルト値に対して小さくする
plt.barbs(x軸上の位置, y軸上の位置, 東西風データ, 南北風データ, sizes=dict(emptybarb=0.05)
- 旗矢羽の幅を2倍にする
plt.barbs(x軸上の位置, y軸上の位置, 東西風データ, 南北風データ, sizes=dict(width=0.50)
風速の小さい矢羽を描かない
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, u, v, color='r')
- 色を青色、赤色、黒色と順番に変える
plt.quiver(x, y, u, v, color=['b', 'r', 'k'])
矢印の幅を変える
plt.quiver(x軸上の位置, y軸上の位置, 東西風データ, 南北風データ, width=数字)幅のデフォルト値は0.005、0.004〜0.006程度が許容範囲
- 矢印の幅を太くする
plt.quiver(x, y, u, v, width=0.006)
矢印の始点の配置方法
plt.quiver(x軸上の位置, y軸上の位置, 東西風データ, 南北風データ, pivot='位置')位置は矢印の始点の位置指定参照
矢印の頭の部分の幅や長さを変える
矢印の頭の幅はheadwidth、頭の長さはheadlengthオプションで指定する
デフォルト値はheadwidth=3、headlength=5、矢印の各部分の名称参照
デフォルト値はheadwidth=3、headlength=5、矢印の各部分の名称参照
- 矢印の頭の幅を大きくする
plt.quiver(x, y, u, v, headwidth=3.5)
- 矢印の頭の長さを長くする
plt.quiver(x, y, u, v, headlength=5.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なので注意
色の名前は色の名前一覧参照
- 等高線を黒色に変える
plt.contour(X, Y, Z, colors='k')
- 青、黒、赤の順で色を並べる
plt.contour(X, Y, Z, colors=['b', 'r', 'k'])
等高線の幅や線種を変える
等高線の幅はlinewidths、線種はlinestylesで指定(linewidth、linestyleではないので注意)
plt.contour(x軸上の位置, y軸上の位置, z軸データ, linestyles='スタイル', linewidths=数字)幅のデフォルト値は1、線種のデフォルト値は実線、線種の一覧参照
- 例:幅を3にする
plt.contour(X, Y, Z, linewidths=3)
- 例:幅を1.2にする(幅は整数でなくてもよい)
plt.contour(X, Y, Z, linewidths=1.2)
- 例:点線にする
plt.contour(X, Y, Z, linestyles=':')
- 例:破線にする
plt.contour(X, Y, Z, linestyles='--')
- 例:実線と点線を交互に(linestylesにリストを渡す)
plt.contour(X, Y, Z, linestyles=['-', ':'])
- 例:太線と細線を交互に(linewidthsにリストを渡す)
plt.contour(X, Y, Z, linewidths=[2, 1])
- 例:太実線と細点線を交互に
plt.contour(X, Y, Z, linestyles=['-', ':'], linewidths=[2, 1])
- 例:太実線、太点線、細実線、細点線の順に並べる
plt.contour(X, Y, Z, linestyles=['-', ':'], linewidths=[2, 2, 1, 1])
等高線を描く値を指定する
levelsオプションに等高線を描きたい値のリストを渡す
plt.contour(x軸上の位置, y軸上の位置, z軸データ, levels=等高線を描く値のリスト)
- 例:1、2、5、10、12の値を描く
levels = [1, 2, 5, 10, 12] # 等高線の値のリスト plt.contour(X, Y, Z, levels=levels)
- 例:2から20まで2毎等間隔に描く
levels = np.arange(2, 20, 2) # 値のリスト作成 plt.contour(X, Y, Z, levels=levels)
- 例:データの最小値から最大値の範囲内で1.5毎等間隔に描く
levels = np.arange(np.floor(Z.min()), np.ceil(Z.max()), 1.5) # 値のリスト作成 plt.contour(X, Y, Z, colors='k', levels=levels) # 等高線を描く
ZがNumpyのndarrayの場合。最小値よりも小さい最大の整数をnp.floor(Z.min())、最大値よりも大きい最小の整数をnp.ceil(Z.max())で取得、Numpyの数学関数、Numpyの統計処理参照
等高線にラベルを付ける
plt.contourの戻り値を使いラベルを付ける
cs = plt.contour(x軸上の位置, y軸上の位置, z軸データ) # 等高線を描く cs.clabel(fmt="%.1f") # ラベルを付ける小数点以下第1位まで表示
- 例:フォントサイズを12にする
cs.clabel(fmt="%.1f", fontsize=12)
- 例:整数で表示
cs.clabel(fmt="%d", fontsize=12)
等高線のラベルを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) # ラベルを付ける
- 例:等高線を2の倍数、ラベルを4の倍数の値に付ける
# levelsに2の倍数をリストとして入れる levels = range(math.floor(Z.min() - math.fmod(Z.min(), 2)), math.ceil(Z.max()) + 1, 2) cs = plt.contour(X, Y, Z, colors='k', levels=levels) # 等高線を描く cs.clabel(cs.levels[::2], fmt="%d", fontsize=12) # 4の倍数の値にラベルを付ける
- 例:実線と破線を描くオプションと組み合わせる
# levelsに2の倍数をリストとして入れる levels = range(math.floor(Z.min() - math.fmod(Z.min(), 2)), math.ceil(Z.max()) + 1, 2) cs = plt.contour(X, Y, Z, colors='k', levels=levels, linestyles=['-', ':']) # 等高線を描く cs.clabel(cs.levels[::2], fmt="%d", fontsize=12) # 4の倍数の値にラベルを付ける
- 例:20 hPa毎に太実線、4 hPa毎に細実線
# levelsに4の倍数をリストとして入れる levels = range(math.floor(Z.min() - math.fmod(Z.min(), 4)), math.ceil(Z.max()) + 1, 4) cs = plt.contour(X, Y, Z, colors='k', levels=levels, linewidths=[1.2, 0.8, 0.8, 0.8, 0.8]) # 4 hPaの等高線を描く cs.clabel(cs.levels[::5], fmt="%d", fontsize=12) # 5飛ばし(20 hPa毎)にラベルを付ける
等高線の色を値に応じて変える
色の付け方はcmapで指定
plt.contour(x軸上の位置, y軸上の位置, z軸データ, cmap='色テーブル')色テーブルは色テーブルの一覧参照
- 例:青〜赤〜緑と変化する色を付ける
plt.contour(X, Y, Z, cmap='brg')
陰影
陰影を描く
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='色テーブル'')色テーブルは色テーブルの一覧参照
- 例:青〜白〜赤と変化と変化する色を付ける
plt.contourf(X, Y, Z, cmap='bwr')
陰影を付ける間隔を変える
levelsオプションに陰影の色を変える値のリストを渡す
plt.contourf(x軸上の位置, y軸上の位置, z軸データ, levels=陰影の色を変える値のリスト)
- 例:Zデータの最小値から最大値の範囲まで1.5間隔で陰影の値を変える
levels = np.arange(np.floor(Z.min()), np.ceil(Z.max())+1, 1.5) plt.contourf(X, Y, Z, levels=levels, cmap='bwr')
ZがNumpyのndarrayの場合。最小値よりも小さい最大の整数をnp.floor(Z.min())、最大値よりも大きい最小の整数をnp.ceil(Z.max())で取得、Numpyの数学関数、Numpyの統計処理参照
陰影を変える個数を指定する
levelsオプションに陰影を変える個数を与える
plt.contourf(x軸上の位置, y軸上の位置, z軸データ, levels=陰影の色を変える個数)
陰影を付ける範囲を変更する
陰影のカラースケールの基準となる下限、上限は、それぞれvmin、vmaxオプションで指定
plt.contourf(x軸上の位置, y軸上の位置, z軸データ, vmin=数字, vmax=数字)
- 例:Zが3〜9の範囲で色を変化させる
plt.contourf(X, Y, Z, cmap='bwr', vmin=3, vmax=9)
- 例:Zが3〜9の範囲で色を変化させ、範囲外の色を指定する
import matplotlib as mpl cmap = plt.get_cmap('bwr') # 色テーブル取得 cmap.set_under('gray') # 下限を下回った場合に灰色 cmap.set_over('w') # 上限を超えた場合に白 plt.contourf(X, Y, Z, cmap=cmap, vmin=3, vmax=9)
cmapの取得は次のように行なってもよいcmap = mpl.colormaps.get_cmap("bwr")
*matplotlib 3.7以降では、次の記述でMatplotlibDeprecationWarningの警告が出るcmap = mpl.cm.get_cmap("bwr")
*matplotlib 3.3から3.6では、plt.get_cmapの戻り値を変更すると警告が出ており、下記のようにcopyしたものを利用していた。import matplotlib as mpl import copy cmap = copy.copy(mpl.colormaps.get_cmap("bwr"))
またはcmap = mpl.colormaps.get_cmap("bwr").copy()
陰影にカラーバーを付ける
plt.colorbar()デフォルトでは縦方向のカラーバーが右側に付けられる
- 例:カラーバーを付け、ラベルも付ける
cbar=plt.colorbar() cbar.set_label('文字列', fontsize=14) # カラーバーにラベルを付ける
plt.colorbarの戻り値cbarを使いラベルを付ける - 例:カラーバーの長さを0.8倍にする
plt.colorbar(shrink=0.8)
- 例:カラーバーを横方向にする
plt.colorbar(orientation='horizontal')
- 例:カラーバーの両端に下限を下回った値、上限を上回った値の色を表示する
plt.colorbar(extend='both')
陰影にハッチを付ける
hatchesオプションを使う
plt.contourf(x軸上の位置, y軸上の位置, z軸データ, hatches='ハッチパターンのリスト')パターンはハッチのパターン参照
- 例:3種類のハッチパターンを繰り返す
plt.contourf(X, Y, Z, levels=levels, cmap=cmap, vmin=3, vmax=9, hatches=['//', '..', 'xx'] )
levelsは陰影を描く値、cmapは色テーブル(陰影を付ける範囲を変更する参照)
陰影を描く値をログスケールにする
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つ前まで)を欠損にした場合
patches.Rectangleの引数は、開始点の座標、横幅、高さの順
欠損値のデータは透明になるので、背景色を灰色にすると欠損値が灰色で塗り潰される(描く順を最背面にするためzorder=-10を指定)
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)
箱ひげ図
箱ひげ図を描く
箱ひげ図で最小値から最大値までヒゲを描く
ヒゲを描く範囲を決めるwhisオプションをwhis=100のように非常に大きな値にしておく
plt.boxplot(データ, whis=100)whisオプションのデフォルト値は1.5(箱の1.5倍) 箱ひげ図参照
箱ひげ図に平均値を描く
緑三角で平均値をプロットする
plt.boxplot(データ, showmeans=True)デフォルト値はFalse(平均値を描かない)
箱ひげ図の平均値のマーカーを変更する
meanpropsオプションに平均値の部分のスタイルを辞書で与える
plt.boxplot(データ, showmeans=True, meanprops=スタイルの辞書)
- マーカーを丸にする
plt.boxplot(データ, showmeans=True, meanprops=dict(marker='o'))
- マーカーサイズを大きくする
plt.boxplot(データ, showmeans=True, meanprops=dict(marker='o', markersize=10))
- マーカーの枠を黒色に変える
plt.boxplot(データ, showmeans=True, meanprops=dict(markeredgecolor='k'))
- マーカーを赤色で塗り潰す
plt.boxplot(データ, showmeans=True, meanprops=dict(markeredgecolor='k', markerfacecolor='r'))
- マーカーを塗り潰さない
plt.boxplot(データ, showmeans=True, meanprops=dict(markeredgecolor='k', markerfacecolor='none'))
None(色を指定しないのでデフォルトのまま)ではなく'none'なので注意
箱ひげ図でpatch_artistを使う
plt.boxplot(データ, patch_artist=True)箱ひげ図の見た目が箱ひげ図の各部分と設定の左側のように箱が青色に塗り潰されるスタイルに変わる。
箱ひげ図のヒゲの色や太さを変える
cappropsオプションにヒゲの端のcap部分のスタイルを辞書で与える
plt.boxplot(データ, capprops=スタイルの辞書)whiskerpropsオプションにヒゲの部分のスタイルを辞書で与える
plt.boxplot(データ, whiskerprops=スタイルの辞書)
- ヒゲを赤色にする
plt.boxplot(データ, capprops=dict(color='r'), whiskerprops=dict(color='r'))
- ヒゲの太さを2にする
plt.boxplot(データ, capprops=dict(linewidth=2), whiskerprops=dict(linewidth=2))
箱ひげ図の箱の色や太さを変える
boxpropsオプションに箱の部分のスタイルを辞書で与える
plt.boxplot(データ, boxprops=スタイルの辞書)
- 箱の枠線の色を赤に変える
plt.boxplot(データ, boxprops=dict(color='r'))
- 箱を水色で塗り潰す
plt.boxplot(データ, boxprops=dict(facecolor='aqua'))
- 箱を塗り潰さない
plt.boxplot(データ, boxprops=dict(facecolor='none'))
Noneではなく'none'なので注意
箱ひげ図の外れ値のマーカーを変更する
flierpropsオプションに外れ値の部分のスタイルを辞書で与える
plt.boxplot(データ, flierprops=スタイルの辞書)
- 外れ値のマーカーの色を青に変える
plt.boxplot(データ, flierprops=dict(markeredgecolor='b'))
- 外れ値のマーカーを小さくする
plt.boxplot(データ, flierprops=dict(markersize=4)
デフォルト値:markersize=6
箱ひげ図の中央値のマーカーを変更する
medianpropsオプションに中央値の部分のスタイルを辞書で与える
plt.boxplot(データ, medianprops=スタイルの辞書)
- 中央値の線の色を青に変える
plt.boxplot(データ, medianprops=dict(color='b'))
箱ひげ図のひげの範囲をパーセントで指定する
ヒゲを描く範囲を決めるwhisオプションで最小値、最大値のパーセント点を与える
plt.boxplot(データ, whis=[最小値, 最大値])
- 5〜95%にひげを描く
plt.boxplot(データ, whis=[5, 95])
- 外れ値を描かない
plt.boxplot(データ, whis=[5, 95], showfliers=False)
箱ひげ図を横に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.boxplot(データ, widths=0.2))
バイオリンプロット
バイオリンプロットを描く
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['bodies']はリストになっているので、matplotlib.collections.LineCollectionを取り出したvpに対して設定
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['パーツ名']の設定を変更する
中央値の横線(cmedians)を幅1の黒実線、平均値の横線(cmeans)を幅1の青破線
*showextrema=Falseの場合は、cbars、cmins、cmaxesの変更はエラーになる
*showmedians=Falseの場合は、cmediansの変更はエラーになる
*showmeans=Falseの場合は、cmeansの変更はエラーになる
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='色の名前')色の名前は色の名前一覧参照
- 流線関数を黒色に変える
plt.streamplot(X, Y, Z, color='k')
流線関数の間隔や線の幅を変える
流線関数の間隔はdensity、線の幅はlinewidthで指定
plt.streamplot(x軸上の位置, y軸上の位置, 東西風, 南北風, density=数字, linewidth=数字)densityのデフォルト値は1、linewidthのデフォルト値は1
- 例:流線関数の幅を2にする
plt.streamplot(X, Y, U, V, linewidths=2)
- 例:流線関数の間隔を広くする
plt.streamplot(X, Y, U, V, density=0.5)
- 例:流線関数の間隔をx軸方向のみ広くする
plt.streamplot(X, Y, U, V, density=[0.5, 1])
density=[x軸方向の密度, y軸方向の密度]のように与える
流線関数の色を値に応じて変える
色の付け方はcmapで指定、色を付ける基準は風速で与える
spd = np.sqrt(東西風**2 + 南北風**2) # 風速 plt.streamplot(x軸上の位置, y軸上の位置, 東西風, 南北風, cmap=plt.cm.'色テーブル')色テーブルは色テーブルの一覧参照
- 例:赤〜黄と変化する色を付ける
spd = np.sqrt(U**2 + V**2) # 風速 ax.streamplot(X, Y, U, V, color=spd, cmap=plt.cm.autumn)
凡例
凡例を付ける
plt.legend()ax.legend()でも同じ(axはfig.add_subplotの戻り値)
凡例の位置を変える
- 凡例の位置を自動設定する(デフォルト値)
plt.legend(loc='best')
- 凡例の位置を左上に変える
plt.legend(loc='upper left')
凡例をグラフの外側に出す
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.framealpha"] = 1.0
凡例の枠線の色を変える
plt.rcParams["legend.edgecolor"] = 数字または色の名前デフォルト値:0.8
数字の場合は、透明度を'0'〜'1'の範囲で指定する('0'で不透明、'1'で透明、数字の場合も文字列として指定)
色の名前は色の名前一覧参照
- 例:枠線の色を黒にする
plt.rcParams["legend.edgecolor"] = 'k'
- 例:枠線を半透明にする
plt.rcParams["legend.edgecolor"] = '0.6'
凡例の枠内を塗り潰す色を変える
plt.rcParams["legend.facecolor"] = 色の名前色の名前は色の名前一覧参照
- 例:枠線の枠内を灰色で塗り潰す
plt.rcParams["legend.facecolor"] = 'gray'
凡例の枠を描かない
- 例:rcParamsを変更する方法
plt.rcParams["legend.edgecolor"] = '1'
- 例:plt.legendのオプションを変更する方法
plt.legend(frameon=False)
凡例内の線を長くする
plt.legend(handlelength=3)*デフォルト値:handlelength=2
凡例内の文字の色を変える
plt.legend(labelcolor='数字または色の名前')色の名前は色の名前一覧参照
- 例:文字の色を黒にする
plt.legend(labelcolor='k')
- 例:文字を半透明にする
plt.legend(labelcolor='0.5')
- 例:線と同じ色のラベルにする
plt.legend(labelcolor='linecolor')
凡例内の線を任意に設定する
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')
- 例:陰影を描いた戻り値を使う
cs = ax.contourf(X, Y, Z) plt.colorbar(cs)
カラーバーを横にする
plt.colorbar(orientation='horizontal')横方向のカラーバーが下側に付く
カラーバーにラベルを付ける
plt.colorbarの戻り値cbarを使いラベルを付ける
cbar = plt.colorbar() # カラーバーを描く cbar.set_label('文字列') # カラーバーにラベルを付ける
- 例:カラーバーのラベルの文字サイズを指定する
cs = ax.contourf(X, Y, Z) # 陰影を描く場合 cbar = plt.colorbar(cs) # カラーバーを描く cbar.set_label('文字列', fontsize=14) # 文字サイズ14でラベルを付ける
カラーバーの目盛り線ラベルの書式を変える
cbar = plt.colorbar(format="書式") # 目盛り線ラベルの書式設定してカラーバーを描く cbar.set_label('文字列') # カラーバーにラベルを付ける
- 例:カラーバーの目盛り線ラベルを整数にする
plt.colorbar(format=“%.0f”)
- 例:カラーバーの目盛り線ラベルを小数点以下第一位まで表示
plt.colorbar(format=“%.1f”)
- 例:小数点以下第一位まで表示し、全体で5文字以上
plt.colorbar(format=“%5.1f”)
カラーバーの大きさを変える
plt.colorbar(shrink=サイズ)デフォルト値:1.0
- 例:カラーバーのサイズを0.8倍にする
plt.colorbar(shrink=0.8)
カラーバーと図枠との間隔を変える
plt.colorbar(pad=間隔)
- 例:カラーバーとグラフとの間隔を広くする(縦方向の場合)
plt.colorbar(pad=0.1)
デフォルト値:pad=0.05 - 例:カラーバーとグラフとの間隔を広くする(横方向の場合)
plt.colorbar(pad=0.1, orientation='horizontal')
デフォルト値:pad=0.15
カラーバーの小目盛りを消す/付ける
- カラーバー作成時の戻り値を使う
cbar = plt.colorbar(オプション) cbar.minorticks_off/on()
- 例:カラーバーの小目盛りを消す
cbar.minorticks_off()
カラーバーに自動で小目盛りが付いてしまった場合などに使用 - 例:カラーバーの小目盛りを付ける
cbar.minorticks_on()
- 例:カラーバーの小目盛りを消す
- カラーバーの目盛り線の設定を変更する
- 例:縦方向カラーバーの小目盛りを消す
import matplotlib.ticker as ticker cbar = plt.colorbar(オプション) cbar.ax.yaxis.set_minor_locator(ticker.NullLocator())
- 例:横方向カラーバーの小目盛りを消す
import matplotlib.ticker as ticker cbar = plt.colorbar(オプション) cbar.ax.xaxis.set_minor_locator(ticker.NullLocator())
- 例:縦方向カラーバーの小目盛りを消す
カラーバーの目盛り線を付ける間隔を変更する
カラーバーの目盛り線の設定を変更する
import matplotlib.ticker as ticker cbar = plt.colorbar(オプション) cbar.ax.yaxis.set_major_locator(ticker.目盛り線の設定) # 縦方向カラーバーの大目盛り cbar.ax.yaxis.set_minor_locator(ticker.目盛り線の設定) # 縦方向カラーバーの小目盛り
- 例:縦方向カラーバーの大目盛り、小目盛りを自動設定
cbar = plt.colorbar(オプション) cbar.ax.yaxis.set_major_locator(ticker.AutoLocator()) # 大目盛り cbar.ax.yaxis.set_minor_locator(ticker.AutoMinorLocator()) # 小目盛り
- 例:横方向カラーバーの大目盛り、小目盛りを自動設定
cbar = plt.colorbar(オプション) cbar.ax.xaxis.set_major_locator(ticker.AutoLocator()) # 大目盛り cbar.ax.xaxis.set_minor_locator(ticker.AutoMinorLocator()) # 小目盛り
- 例:縦方向カラーバーの大目盛り、小目盛りの値を任意の値に設定する
cbar = plt.colorbar(オプション) cbar.ax.yaxis.set_major_locator(ticker.FixedLocator([1, 5, 10, 50, 100])) # 大目盛り cbar.ax.yaxis.set_minor_locator(ticker.FixedLocator(np.arange(1, 100, 1)))) # 小目盛り
大目盛りは、1、5、10、50、100、小目盛りは1から99まで1毎
横方向の場合は、yaxisではなくxaxisを変更する - 例:横方向カラーバーの大目盛りに任意の値を設定し、小目盛りを描かない
cbar = plt.colorbar(オプション) cbar.ax.xaxis.set_major_locator(ticker.FixedLocator([3, 5, 8, 10, 15])) # 大目盛り cbar.ax.xaxis.set_minor_locator(ticker.NullLocator()) # 小目盛り
- 例:colorbarを描く際に大目盛りの値を設定する方法
cbar = plt.colorbar(オプション, ticks=[3, 5, 8, 10, 15]) cbar.ax.xaxis.set_minor_locator(ticker.NullLocator()) # 小目盛り
colorbarのオプションticksには、np.arrayやリストなどを与えることができる
カラーバーの目盛り線ラベルに任意の文字列を付ける
plt.colorbar(ticks=[目盛り線を描く値のリスト], orientation='カラーバーの向き')
- カラーバーが縦の場合
cbar.ax.set_yticklabels(cs, [目盛り線ラベルのリスト])
- カラーバーが横の場合
cbar.ax.set_xticklabels(cs, [目盛り線ラベルのリスト])
- 例:カラーバーが横の場合
cs = plt.contourf(X, Y, Z) # 陰影を描く場合 cbar = plt.colorbar(cs, ticks=[1, 2, 3], オプション) cbar.ax.set_yticklabels(cs, ["lab1", "lab2", "lab3"])
- 例:カラーバーが横の場合
cs = plt.contourf(X, Y, Z) # 陰影を描く場合 cbar = plt.colorbar(cs, ticks=[1, 2, 3], orientation='horizontal', オプション) cbar.ax.set_xticklabels(cs, ["lab1", "lab2", "lab3"])
- 例:fig.colorbarを使う場合(縦方向)
cs = plt.contourf(X, Y, Z) # 陰影を描く場合 cbar = fig.colorbar(cs, ticks=[1, 2, 3], orientation='horizontal', オプション) cbar.ax.set_yticklabels(cs, ["lab1", "lab2", "lab3"])
- 例:fig.colorbarを使う場合(横方向)
cs = plt.contourf(X, Y, Z) # 陰影を描く場合 cbar = fig.colorbar(cs, ticks=[1, 2, 3], orientation='horizontal', オプション) cbar.ax.set_xticklabels(cs, ["lab1", "lab2", "lab3"])
テキスト
テキストをプロットする
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=角度)
- 文字列を90度回転させる(縦書きにする)
plt.text(xloc, yloc, rotation=90)
- 文字列を斜めにする(70度回転の場合)
plt.legend(xloc, yloc, rotation=70)
アニメーション
アニメーションを作成
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で書き出す場合
- フレームの切り替え間隔を倍にする
anim = animation.ArtistAnimation(fig, imgs, delay=100)
デフォルト値:delay=200(単位はミリ秒) - アニメーションを繰り返さない
anim = animation.ArtistAnimation(fig, imgs, repeat=False)
デフォルト値:repeat=True - 描画を高速化(blittingという手法を有効)
anim = animation.ArtistAnimation(fig, imgs, blit=True)
デフォルト値:blit=False
複数のグラフを重ねる
同時刻の複数のグラフを同じサブプロットに描く場合
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軸の文字サイズを指定する場合の例:16ポイント
plt.xlabel("x軸ラベル", fontsize=16)
文字サイズは文字列でも指定可能 - y軸の文字の色を赤色に指定する場合の例:
plt.ylabel("y軸ラベル", color='r')
色の名前は色の名前一覧参照 - サブプロットを作成した際の戻り値axを使うこともできる
ax.set_xlabel("x軸ラベル", fontsize=16) ax.set_ylabel("x軸ラベル", color='r')
- 全体の文字サイズをデフォルトの10から12に変更する
plt.rcParams["font.size"] = 12
x軸・y軸ラベルだけではなく、図の全体で変更される
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はサブプロットを作成した際の戻り値
- ticker.MultipleLocatorを使う例:y軸の大目盛りを10毎、小目盛りを2毎に付ける
import matplotlib.ticker as ticker ax.yaxis.set_major_locator(ticker.MultipleLocator(10.00)) ax.yaxis.set_minor_locator(ticker.MultipleLocator(2.00))
- ticker.MultipleLocatorを使う例:x軸の大目盛りを3毎、小目盛りを1毎に付ける
import matplotlib.ticker as ticker ax.xaxis.set_major_locator(ticker.MultipleLocator(3)) ax.xaxis.set_minor_locator(ticker.MultipleLocator(1))
*x軸が時刻データの場合は、大目盛りが3毎、小目盛りが1毎になる - FixedLocatorを使う例:y軸の任意の場所に目盛り線を付ける
import matplotlib.ticker as ticker ax.yaxis.set_major_locator(ticker.FixedLocator(大目盛り線の値のリスト)) ax.yaxis.set_minor_locator(ticker.FixedLocator(小目盛り線の値のリスト))
- x軸の時刻大目盛りを半年毎に付ける
import matplotlib.dates as mdates ax.xaxis.set_major_locator(mdates.MonthLocator(interval=6))
- x軸の時刻小目盛りを1ヶ月毎に付ける
ax.xaxis.set_minor_locator(mdates.MonthLocator(interval=1))
目盛り線とラベルを任意の場所に付ける
ax.set_xticks、ax.set_xticklabelsを使い、x軸の任意の場所に目盛り線とラベルを付ける
ax.set_xticksを使う場合、ax.xaxis.set_major_locatorは設定しない
ax.set_xticks([目盛り線の値のリスト]) # 目盛り線 ax.set_xticklabels([ラベルのリスト]) # 目盛り線のラベルaxはサブプロットを作成した際の戻り値
ax.set_xticksを使う場合、ax.xaxis.set_major_locatorは設定しない
x軸、y軸の目盛り線ラベルの文字サイズを変更する
plt.rcParamsの設定を変更する
- x軸主目盛り線ラベルの文字サイズを12に設定する
ax.axes.tick_params(labelsize=12)
axはサブプロットを作成した際の戻り値 - y軸主目盛り線ラベルの文字サイズを16に設定する
ax.axes.tick_params(labelsize=16)
- 全体の文字サイズをデフォルトの10から12に変更する
plt.rcParams["font.size"] = 12
サイズは文字列では指定できない
x軸の目盛り線ラベルの文字列を回転させる
xticklabelsの書式を変更する
自動的にx軸ラベルの表記を斜めにするには次のようにする
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軸の範囲を指定する
- plt.xlim、plt.ylimを使う方法
plt.xlim([x軸最小値, x軸最大値]) plt.ylim([y軸最小値, y軸最大値])
- ax.set_xlim、ax.set_ylimを使う方法
ax.set_xlim([x軸最小値, x軸最大値]) ax.set_ylim([y軸最小値, y軸最大値])
axはサブプロットを作成した際の戻り値
時間軸データの場合は、図の時間軸の表示を調整する参照
x軸、y軸の範囲を取得する
x軸の範囲をxmin、xmax、y軸の範囲をymin、ymaxに入力
xmin, xmax, ymin, ymax = plt.axis()
小目盛り線を付ける/消す
plt.rcParamsの設定を変更する
- 小目盛り線を付ける
plt.rcParams["xtick.minor.visible"] = True # x軸 plt.rcParams["ytick.minor.visible"] = True # y軸
- 小目盛り線を消す
plt.rcParams["xtick.minor.visible"] = False # x軸 plt.rcParams["ytick.minor.visible"] = False # y軸
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を使い、主目盛り線ラベルの時刻表記を変える
目盛り線を付ける場所を変える際も、matplotlib.datesを使うことが可能(x軸、y軸の目盛り線の間隔を変更する参照)
x軸の時刻を描く範囲を指定する場合
import matplotlib.dates as mdate ax.xaxis.set_major_formatter(mdates.DateFormatter('時刻表記の書式'))
- 4桁の年-2桁の月-2桁の日表記にする(例:2022-08-31)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
- 4桁の年/2桁の月表記にする(例:2022/08)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y/%m'))
- 2桁の年/2桁の月表記にする(例:22/08)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%y/%m'))
- 2桁の月/2桁の日表記にする(例:08/21)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
- 3文字の月 2桁の日表記にする(例:Aug 21)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %d'))
目盛り線を付ける場所を変える際も、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までに設定する
軸の上下、左右を逆転させる
- 軸の設定を変更する方法
- x軸を反転させる場合
ax.invert_xaxis()
- y軸を反転させる場合
ax.invert_yaxis()
- ログスケールのx軸を反転させる場合
ax.set_xscale("log") ax.invert_xaxis()
- ログスケールのy軸を反転させる場合
ax.set_yscale("log") ax.invert_yaxis()
- x軸を反転させる場合
- 直前に操作したサブプロットの設定を変更する場合
- x軸を反転させる場合
plt.gca().invert_xaxis()
- y軸を反転させる場合
plt.gca().invert_yaxis()
- x軸を反転させる場合
- set_ylimで大きな値を先、小さな値を後に書く
- x軸を反転させる場合(-1から1の区間)
ax.set_xlim([1, -1])
- y軸を反転させる場合(-100から200の区間)
ax.set_ylim([200, -100])
- ログスケールのy軸を反転させる場合(10から1000 hPa)
ax.set_yscale("log") ax.set_ylim([1000, 10])
- x軸を反転させる場合(-1から1の区間)
- ax.set_ylimで上端と下端を逆転させた値を設定
- x軸を反転させる場合
ax.set_xlim(ax.get_xlim()[::-1])
ax.get_xlim()でx軸の範囲を取得する - y軸を反転させる場合
ax.set_ylim(ax.get_ylim()[::-1])
ax.get_ylim()でy軸の範囲を取得する
- x軸を反転させる場合
y軸をログスケールにした時にラベルの数字を整数表示する
matplotlib.tickerに含まれるLogLocatorとFuncFormatterを使う
- y軸が気圧面高度の場合に大目盛りに1000、100、10、1の文字を表示
import matplotlib.ticker as ticker def major_formatter(x, pos): return "%.0f" % x ax.yaxis.set_major_locator(ticker.LogLocator(base=10.0, numticks=15)) ax.yaxis.set_major_formatter(ticker.FuncFormatter(major_formatter))
- 小目盛りにラベルを表示させない(NullFormatterを使う)
ax.yaxis.set_minor_formatter(ticker.NullFormatter())
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を用いる。
*小数第一位まで表示するには、"%.0e"を"%.1e"に変更する
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はサブプロットを作成した際の戻り値)
- 1行で一括設定する方法
ax.set(xlim=[x軸下限, x軸上限], ylim=[y軸下限, y軸上限], xlabel="x軸ラベル", ylabel="y軸ラベル", title="図のタイトル", xticks=[x軸目盛り線を描く値], xticklabels=[x軸目盛り線ラベル], axisbelow=True)
ax.set_xlimがxlim、ax.set_ylimがylim、ax.set_xlabelがxlabel、ax.set_ylabel がylabel、ax.set_titleがtitle、ax.set_xticksがxticks、ax.set_xticklabelsがxticklabels、ax.set_axisbelowがaxisbelowに対応 - 設定を辞書型に格納して与える方法
STYLE = { 'xlim': [x軸下限, x軸上限], 'ylim': [y軸下限, y軸上限], 'xlabel': "x軸ラベル", 'ylabel': "y軸ラベル", 'title': "図のタイトル", 'xticks': [x軸目盛り線を描く値], 'xticklabels': [x軸目盛り線ラベル], 'axisbelow': True, } ax.set(**STYLE)
図の体裁
全体のフォントをまとめて指定する
plt.rcParams["font.family"] = "Times New Roman"Times New Romanに変更
全体の文字サイズをまとめて指定する
12ポイントに設定する(デフォルト値:10ポイント)
plt.rcParams["font.size"] = 12
タイトルの文字サイズや色を変更する
タイトルや軸ラベル、テキストのフォントを指定する
fontfamilyオプションでTimes New Romanに変更する場合
- plt.title、plt.xlabel、plt.ylabel、plt.textでの設定
plt.title("タイトル", fontfamily="Times New Roman") plt.xlabel("x軸のラベル", fontfamily="Times New Roman") plt.ylabel("y軸のラベル", fontfamily="Times New Roman") plt.text(x位置, y位置, "テキスト", fontfamily="Times New Roman")
- ax.set_title、ax.set_xlabel、ax.set_ylabel、ax.textでの設定
ax.set_title("タイトル", fontfamily="Times New Roman") ax.set_xlabel("x軸のラベル", fontfamily="Times New Roman") ax.set_ylabel("y軸のラベル", fontfamily="Times New Roman") ax.text(x位置, y位置, "テキスト", fontfamily="Times New Roman")
axはサブプロットを作成した際の戻り値
マーカーや線を重ねる順序を調整する
zorder=整数、で数字が大きい方を後に描く
plt.scatter(xデータ1, yデータ1, zorder=2) # 散布図を上に plt.plot(xデータ2, yデータ2, zorder=1) # 折れ線グラフを下に
グリッド線を引く
plt.grid()
- 例:グリッド線を灰色の点線にする
plt.grid(color='gray', ls=':')
- 例:x軸のみにグリッド線を引く
plt.grid(axis="x", color='gray', ls=':')
- 例:y軸のみにグリッド線を引く
plt.grid(axis="y", color='gray', ls=':')
- 例:グリッド線を細くする
plt.grid(color='gray', ls=':', lw=0.5)
デフォルト値:lw=1
グリッド線を背面に表示する
グリッド線がグラフの前面に来た場合は、ax.set_axisbelowで背面に移動する
グラフのzorderを0.5未満に設定した場合は、この設定を行ってもグリッド線がグラフの前面に表示される
ax.set_axisbelow(True)Trueでzorder = 0.5になる、デフォルト値は"line"(zorder = 1.5)
グラフのzorderを0.5未満に設定した場合は、この設定を行ってもグリッド線がグラフの前面に表示される
図の枠線や目盛りを消す
- 枠線と目盛りを全て消す
plt.axis('off')
- 直前に操作したplt.gca()を変更し、特定の枠線と目盛りを消す
- 右側の枠線と目盛りを消す場合
plt.gca().spines['right'].set_visible(False) plt.gca().yaxis.set_ticks_position('left')
1行目だけでは右側の目盛りと目盛り線が残ってしまうので、2行目で左側だけ残す指定を行なっている - 上側の枠線と目盛りを消す場合
plt.gca().spines['top'].set_visible(False) plt.gca().xaxis.set_ticks_position('bottom')
1行目だけでは上側の目盛りと目盛り線が残ってしまうので、2行目で下側だけ残す指定を行なっている - 左側の枠線と目盛りを消す場合
plt.gca().spines['left'].set_visible(False) plt.gca().yaxis.set_ticks_position('right')
2行目の指定で、右側に目盛りと目盛り線を付けている - 下側の枠線と目盛りを消す場合
plt.gca().spines['bottom'].set_visible(False) plt.gca().xaxis.set_ticks_position('top')
2行目の指定で、上側に目盛りと目盛り線を付けている
- 右側の枠線と目盛りを消す場合
図の枠線の幅を変える
枠線の幅を太くする(デフォルト値:1.0)
[top] plt.rcParams["axes.linewidth"] = 1.5