matplotlib の figure(図) と axes(座標軸)-python

python の matplotlib でグラフを描くのは非常に簡単です。とくに、グラフが 1 つだけの場合は

と、わずかな記述だけで描画が実行されます。

plot_1

グラフが複数の場合は少しだけ考慮が必要になるので、それを順に見ていきます。

- 目次 -

スポンサーリンク

複数のグラフ

複数のグラフを描く場合figureaxesという概念が出てきます。figure は図全体、axes はその内部に用意される座標軸です。

fig4

figure – axes

実際にグラフを 2 つ描く場合は

  • figureを 1 つ用意し、その中にaxesを 2 つ作成するケース
  • figureを 2 つ用意し、その中にaxesを 1 つづつ作成するケース

が考えられます。

fig2


それぞれのサンプルはこうなります。

figure を 1 つ

figure を 2 つ

figure メソッドで figure を作成、subplot メソッドで axes を作成しています(subplot メソッドについては後述します)。

描画は以下のようになります。

plot_win_1
plot_win_2

ファイルへの保存は figure 単位

保存はsavefigメソッドで行いますが

figure 単位で保存されるので、1 ファイルにまとめたければ前者、グラフごとにわけて保存したければ後者になります。


~~~
では、ここからは figure を 1 つにして、内部に複数のグラフを描く方法を詳しく見ていきます。

subplot

グリッド上にグラフを配置

グリッド上に規則正しくグラフを配置する場合はsubplotメソッドを使います。

行数 × 列数 のグリッドに figure が分割され、プロット番号の位置に座標軸が作成されます。
プロット番号は、左上が 1 で、右方向、下方向へいくにしたがい値が大きくなります。たとえば、2 × 2 のグリッドの場合は

1 2
3 4

となります。

plt.subplot(2,2,1) は カンマを省いて plt.subplot(221) と書くこともできます。ただし、プロット番号が 10 以上の場合は、カンマが必須です。

下記のとおり描画されます。

subplot4

別の書き方

上記サンプルは、以下のような書き方もできます。結果は同じになります。

座標を先に確保

figure に add_subplot

axes

自由にグラフを配置

自由にグラフを配置する場合axesメソッドを使います。

各値を 0 から 1 の小数で指定します。

描画はこうなります。
axes4

gridspec

グリッド上に変則配置

GridSpecを使うと、グリッド上で変則的な配置が行えます。

ポイント

以下の記述で figure を 2 × 3 のグリッドに分割しています。

gs を 2 × 3 の 2次元配列と考え、グラフを配置したい場所を指定します。たとえば

この gs[x, x] を subplot に渡して座標軸を作成します。

描画はこうなります。
gridspec4

スポンサーリンク
その他の記事
  1. ひよこパイソン says:

    パイソン超初心者です。
    いちばんはじめのx^2のグラフを実行してみたところ、couldn't connect to display "localhost:0.0"とエラーが出てしまいました。何かダウンロードしなければならないものがあるのでしょうか。

    • こんにちわ、ひよこパイソンさん。

      もしかして X 環境でしょうか。
      python というより、サーバー関係の設定のような気がします。
      たとえば、こんなページは参考になりませんか。
      http://d.hatena.ne.jp/sobasobasoba/mobile?date=20121231

  2. Python初心者です。
    わかりやすい記事ありがとうございます。

    下記のように関数から複数のaxesを作成している場合に、関数外でaxesを指定してデータを追加することは可能なのでしょうか?

    ***********************************************

    #————————-
    def Graph_(fig0,データ):

    fig1 = fig0.add_axes([0.1,0.3,0.8,0.8])
    fig2 = fig0.add_axes([0.1,0.1,0.8,0.2])

    fig1.plot(データ)
    fig2.plot(データ)

    #————————-

    Fig0 = plt.figure()
    Graph_(Fig0,データ)

    #◀ここで関数内で作った「fig2」にデータを追加したい

    ***********************************************
    教えていただけると幸いです。

    • EggPython さん、こんにちは

      戻り値を使います。

      #————————-
      def Graph_(fig0,データ):

      fig1 = fig0.add_axes([0.1,0.3,0.8,0.8])
      fig2 = fig0.add_axes([0.1,0.1,0.8,0.2])

      fig1.plot(データ)
      fig2.plot(データ)

      return fig2 # 戻り値

      #————————-

      Fig0 = plt.figure()
      f = Graph_(Fig0,データ)
      f.plot(データ)

      • お返事ありがとうございます。
        下記コードで実行してみたのですが、
        ※1の箇所で「AttributeError: 'NoneType' object has no attribute 'plot'」とエラーが出ます。

        生成される上下2段のグラフのうち、上段の方(fig1)に(x,y3)のデータを関数の外で追加する方法をご存知であれば教え頂けると助かります。
        そもそもfigureは作成後に編集するような操作はできないものなのでしょうか。

        因みに※1か所を
        plt.plot(x,y3)
        とすると、下段のグラフ(fig2)にデータが追加されます。

        よろしくお願いいたします。
        ==================================
        import matplotlib.pyplot as plt

        def Graph_(fig0,x,y1,y2):
        fig1 = fig0.add_axes([0.1,0.3,0.8,0.8])
        fig2 = fig0.add_axes([0.1,0.1,0.8,0.2])

        fig1.plot(x,y1)
        fig2.plot(x,y2)

        #データの配列作成
        x = [i for i in range(100)]
        y1 = x
        y2 = [i**2 for i in x]
        y3 = [99**2-i**2 for i in x]

        #グラフ描画
        Fig0 = plt.figure()
        f = Graph_(Fig0,x,y1,y2)
        f.plot(x,y3)#・・・※1
        ==================================

コメントはお気軽に