Matplotlibの使い方
matplotlibはPythonでグラフを描くための基本ライブラリです。
標準ライブラリでははいですが、2010年ころからデファクトスタンダードとして広く使われています。
matplotlibには
MATLAB的な記述スタイル(pyplot-style)と
オブジェクト指向的な記述スタイル(OO-style)があります。
このドキュメントでは公式で推奨されているOO-styleを中心に紹介します。
注釈
MATLABユーザーでないかぎりOO-styleを使えばよいと思います。
また、OO-styleとpyplot-styleを意図せずに混ぜて使うのは避けた方がよいと思います。
- インストールしたい(
matplotlib) - インポートしたい(
matplotlib.pyplot) - 描画スタイルしたい(
matplotlib.rcParams) - キャンバスしたい(
matplotlib.figure.Figure) - キャンバスしたい(
matplotlib.pyplot.subplots) - キャンバスを割付したい(
matplotlib.pyplot.subplot_mosaic) - 凡例したい(
matplotlib.axes.Axes.legend) - ヒストグラムしたい(
matplotlib.axes.Axes.hist) - 棒グラフしたい(
matplotlib.axes.Axes.bar) - 折れ線したい(
matplotlib.axes.Axes.plot) - 散布図したい(
matplotlib.axes.Axes.scatter) - ヒートマップしたい(
matplotlib.axes.Axes.imshow) - エラーバーしたい(
matplotlib.axes.Axes.errorbar) - 等高線したい(
matplotlib.axes.Axes.contour) - 箱ひげ図したい(
matplotlib.axes.Axes.boxplot) - バイオリン図したい(
matplotlib.axes.Axes.violinplot) - 円グラフしたい(
matplotlib.axes.Axes.pie) - リアルタイム描画したい(
matplotlib.animation.FuncAnimation) pandasしたい
Axes and Figure
matplotlibの用語として把握しておくべきなのはAxesとFigureです。
Axesは独立した図オブジェクト単体を指します。
Figureは最終的に保存する描画オブジェクトを指し、複数のAxesオブジェクトを含むことができます。
Figureオブジェクトの構成要素は
Parts of a Figureの図と説明を参照してください。
ヒント
ROOTを使ってるひとは、
FigureオブジェクトはTCanvasオブジェクト相当、
AxesオブジェクトはTCanvas::Divideしたエリア相当、
とイメージするとよいと思います。
1# OO-styleの基本形
2import matplotlib.pyplot as plt
3
4# データオブジェクト(辞書型 or データフレーム)
5# sample_data: dict | pd.DataFrame
6
7fig, ax = plt.subplots()
8ax.scatter(
9 data=sample_data,
10 x="X軸のカラム名",
11 y="Y軸のカラム名",
12 c="マーカーの色のカラム名",
13 marker="マーカーの種類")
14ax.set_title("散布図のタイトル")
15ax_set_xlabel("X軸のタイトル")
16ax_set_ylabel("Y軸のタイトル")
OO-styleの基本的な形として、
matplotlib.pyplot.subplotsで描画オブジェクト(FigureオブジェクトとAxesオブジェクト)を作成し、
matplotlib.axes.Axes.plotを使ってグラフを作成&詳細設定します。
ヒント
pandas.DataFrameなどのデータフレームからグラフを作成する場合に、
X軸とY軸の値をnumpy.arrayなどに変換しているサンプルを見かけますが、
dataオプションでデータフレームを指定し、
X軸とY軸にカラム名を指定すればよいと思います。
ImplicitからExplicitに変換したい
1# Current Figure を取得する
2fig = plt.gcf()
3
4# Current Axesを取得する
5ax = plt.gca()
plt.gcfやplt.gcaでimplicit interfaceで使われているグローバルオブジェクトをexplicit interfaceとして使えるようにできます。