注目キーワード

【Python】maplotlibの基本的な考え方と使い方

様々なデータを処理した結果、最終的にグラフとしてデータを出力することがあります。matplotlibはグラフ作成に関する標準的なライブラリで、非常に多くの場所で使われています。こちらのページはmatplotlib公式のギャラリーです。普段目にする多くのグラフを描画することができると分かります。

こちらの記事ではPythonでグラフ描画を行うために、matplotlibを使う場合の本当に基本的な考え方について説明します。

インストール

matplotlib本体と、日本語化対応のために japanize-matplotlib をインストールします。matplotlibは環境によっては既にインストールされているかもしれません。pip install matplotlib pip install japanize-matplotlib を実行してください。
また以下のサンプルではランダムデータを作るためにnumpyを利用しているので、インストールされていない場合には pip install numpy も必要になります。

基本的な考え方

matplotlibでグラフを描画するとき、次の公式ドキュメントの図で説明されるような概念が関わってきます。これは matplotlib で作成する図がどのようなアイテムから構成されているのか?を示している図です。

グラフ上の要素

基本的な考え方としては

  • 大きな土台として Figure() があります。
  • Figureには描画領域としてのAxesが乗っています。
  • Axesの上に軸や実際のグラフプロットが乗っています。

これらの要素をプログラムで操作しながらグラフを描画するのが matplotlibの基本的な使い方です。大まかに分けてMatLab的な操作で描画するpyplotインタフェースと、オブジェクト指向的に描画するインタフェースの両方が用意されています。基本的にどちらの使い方でもほぼ同じことが出来るようになっていますが、微妙に使い方や微調整の仕方がことなります。他のブログやドキュメントを見た際にも、どっちの使い方をしているのか?を意識すると理解しやすいことがあります。

以上を踏まえて、pyplotインタフェースとオブジェクト指向型のインタフェースの両方を見てみましょう。

matplotlibを用いた基本的なプロット(pyplotインタフェース)

numpyを同時に利用してランダムなグラフを描いてみます。

サンプルソース

サンプルの実装です。

最初にインタフェースにアクセスするためにmatplotlib.pyplotをpltという名前でインポートし、日本語に対応するためにjapanize-matplotlibをインポートします。

plt.XXX の形で呼び出している行は、pyplotインタフェースでグラフを描画しているコマンド群です。

  • 5行目: 最初に (5, 5) の比率で描画領域を作成しました(figsize)
  • 6行目: 次にランダムな10点をnumpyで作成し、プロットしました
  • 7-8行目: x軸とy軸のラベルを付けました
  • 9行目: タイトルを付けました
  • 10-11行目: グラフをファイルに保存しました(そのまま保存、余白をtightに調整して保存)
  • 12行目: 現在のグラフの余白を調整しました
  • 13行目: 現在のグラフを表示しました
  • 14行目: 作成していたグラフを閉じました(終了)

他の種類のグラフを使う場合でも、似たような構成になることが多いです。今回はファイル保存と表示の両方を行いましたが、片方でももちろん大丈夫です。

実行結果(作成されたグラフ)

保存した2つのグラフを確認して、余白調整がどのように影響するのかを見てみます。

こちらは余白調整をしていない結果です。

余白調整されていない出力

こちらは余白調整してから保存した結果です。

余白調整した出力

スクリーン上ではあまり差がないかもしれないですが、手元に保存して余白を見てみると、余白調整するといい感じにグラフが収まっていることが分かります。matplotlibの余白調整は、凝ったグラフを書くと複雑になりがちで、いろいろと調べる必要があり難しいです。公式ドキュメントのギャラリーなどを参考に、いろいろと調整してみてください。

スポンサーリンク

matplotlibを用いた基本的なプロット(オブジェクト指向型インタフェース)

pyplotインタフェースを使う場合、基本的に plt.XXX という形で関数を呼び出し、今作成しているFigure/Axes/Plotなどを暗黙的に対象として処理が行われています。一方でオブジェクト指向型のインターフェースを使う場合には「このFigure」、「Figureから作ったこのAxes」など、細かに名前を指し示し、そのオブジェクトに対して処理を実行します。先程と同じ処理を行うサンプルソースを見てみましょう。

サンプルソース

サンプルの実装です。

ほとんど同じ実装ですが、以下が異なる点です。

  • 作成したFigureから、今操作対象としているAxesを取得しています(gca = get current axes)。ちなみに現在処理対象としているFigureはgcfで取得できます。
  • 対象とするaxesの上に線をプロットします(ax.plot)
  • 対象とするaxesに対して、xlabelとylabelを設定します(set_xlabel、set_ylabel)
  • 対象とするaxesに対して、タイトルを設定します(set_title)

このようにplt.XXX と少しだけ違うのですが、基本的には似た操作でグラフが描画できると分かります。

サンプルを実行した結果の図(余白調整済み)

余白調整済みの図はこのようになりました。データは乱数の分異なるのですが、同じ形の図をオブジェクト指向型のインタフェースを用いて作成することができました。

余白調整された出力

最初にも述べたとおり matplotlib はかなり多機能なライブラリになっていて、いろんな機能があります。

基本的にはどちらのインタフェースを使ってグラフを描画しているか?を意識して、世の中のサンプルコードやドキュメントを読むことで、望んだグラフが描けると思います。一度使ってみてくださいね。機会があれば、こちらのブログでも使い方を更に説明していけたらと思います。