matplotlibでplot、axes、またはfigureを使用してプロットを描画することの違いは何ですか?


100

matplotlib、tbhでプロットを描画するときに、バックエンドで何が起こっているのか混乱しています。プロット、軸、および図の階層が明確ではありません。ドキュメントを読んで役に立ちましたが、まだ混乱しています...

以下のコードは、3つの異なる方法で同じプロットを描画します-

#creating the arrays for testing
x = np.arange(1, 100)
y = np.sqrt(x)
#1st way
plt.plot(x, y)
#2nd way
ax = plt.subplot()
ax.plot(x, y)
#3rd way
figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)

今私の質問は-

  1. 3つすべての違いは何ですか。つまり、3つのメソッドのいずれかが呼び出されたときに、内部で何が起こっているのでしょうか。

  2. どの方法をいつ使用する必要があり、それらにいずれかを使用することの長所と短所は何ですか?


8
私はすでにそれを読みましたが、満足のいく答えはまったく見つかりませんでした。それは階層を説明しますが、なぜ従来の方法がないのか、なぜフィギュアオブジェクトが露出しているのかという混乱を引き起こします。
hashcode55 2016年

この正確なドキュメントmatplotlib.org/users/artists.htmlを参照したかどうかはわかりません。これは、なぜフィギュアが露出しているのかというあなたの質問に答えます。個人的には、これが私が見つけたmatplotlibの最良の説明です。Figureオブジェクトを使用すると、軸なしで独自のアーティストを直接追加できますが、Figure自体の「パッチ」などを微調整する場合を除いて、これはめったに使用されません。Figureは親コンテナであり、AxesとArtistsをホストすることに注意してください。
Sandeep 2018年

回答:


54

方法1

plt.plot(x, y)

これにより、(x、y)座標で1つの図をプロットできます。グラフィックを1つだけ取得したい場合は、この方法を使用できます。

方法2

ax = plt.subplot()
ax.plot(x, y)

これにより、同じウィンドウに1つまたは複数の図をプロットできます。あなたがそれを書くとき、あなたはただ一つの図をプロットするでしょう、しかしあなたはこのようなものを作ることができます:

fig1, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)

ax1、ax2、ax3、ax4という名前の4つの図を、それぞれ同じウィンドウにプロットします。このウィンドウは、私の例では4つの部分に分かれています。

方法3

fig = plt.figure()
new_plot = fig.add_subplot(111)
new_plot.plot(x, y)

私はそれを使用しませんでしたが、ドキュメントを見つけることができます。

例:

import numpy as np
import matplotlib.pyplot as plt

# Method 1 #

x = np.random.rand(10)
y = np.random.rand(10)

figure1 = plt.plot(x,y)

# Method 2 #

x1 = np.random.rand(10)
x2 = np.random.rand(10)
x3 = np.random.rand(10)
x4 = np.random.rand(10)
y1 = np.random.rand(10)
y2 = np.random.rand(10)
y3 = np.random.rand(10)
y4 = np.random.rand(10)

figure2, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
ax1.plot(x1,y1)
ax2.plot(x2,y2)
ax3.plot(x3,y3)
ax4.plot(x4,y4)

plt.show()

ここに画像の説明を入力してください ここに画像の説明を入力してください

その他の例:

ここに画像の説明を入力してください


@ hashcode55各図は独立しています。例を示します
エセックス

1
@ hashcode55例を使って編集します(天体物理学の研究からの図だけです。スクリプトが長すぎます(1300行));)各図は独立しています;)
Essex

3
私はこれが厄介であることを知っていますが、matplotlib言語が私を混乱させたので私はそれをしています、そしてこの質問は「matplotlibの軸対図」について検索するときに現れます。他の初心者にとって、この質問はそれに答えるのに役立ちました。ここでの表現は、単一のオブジェクトsubplots()を返すことでより明確になると思います。Axesfigure
ヘンディ2017

34

オブジェクトの名前

Matplotlibはオブジェクト指向であり、その主要なオブジェクトは軸です(名前はaxesは少し誤解を招くとが、おそらく私だけです)。

フィギュアキャンバスと考えることができます。通常、サイズや背景色などを指定します。キャンバスとフィギュアは、基本的に2つの方法で使用し、他のオブジェクト(主にですが、ほとんどは)を配置します。また、テキストラベルなど)、その内容をsavefig。で保存します。

あなたは考えることができ申し出ツール(例えばというスイスアーミーナイフのようなもの、便利なオブジェクトとして.plot.scatter.histほとんどすべてのためなど)、。さまざまな方法のいずれかを使用して、1つ、2つ、...多くの図形内に配置できます。

pltインターフェース

PLT手続きインタフェースは、もともとMATLAB™インタフェース模倣するために開発されていますが、メインのオブジェクトへの直接参照を作成していない場合でも、オブジェクト指向のインターフェイスから実際に違いはありませんして(すなわち、および)、これらのオブジェクトであります自動的にインスタンス化され、各pltメソッドは、基本的に、基になる基本オブジェクトのメソッドの1つの呼び出しに変換されます。たとえば、aplt.plot()はaでhidden_axes.plot、aplt.savefigはahidden_figure.savefigです。

すべての瞬間では、使用して、これらの隠されたオブジェクトのハンドルを持つことができるplt.gcfplt.gca、オブジェクトのメソッドのいずれかがでメソッドに移植されていない場合、これは時々必要であるPLTの名前空間。

plt名前空間には、さまざまな方法でをインスタンス化するための便利なメソッドもいくつか含まれていることを付け加えたいと思います。

あなたの例

第一の方法

plt.plot(x, y)

ここではpltインターフェースのみを使用し、各で使用できるは1つだけですが、これはデータの探索を行うときに必要なものであり、作業を完了するための簡単なレシピです...

2番目の方法

ax = plt.subplot()
ax.plot(x, y)

ここでは、plt名前空間で便利なメソッドを使用して、Axesオブジェクトに名前(およびハンドル)を付けていますが、非表示のもあります。後でaxesオブジェクトを使用して、pltインターフェイスで実行できるすべてのことをプロットしたり、ヒストグラムを作成したりできますが、そのすべての属性にアクセスして、より自由に変更することもできます。

第三の道

figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)

ここでは、plt名前空間で便利なメソッドを使用してFigureのインスタンス化を開始し、後でオブジェクト指向インターフェイスのみを使用します。

pltコンビニエンスメソッド(matplotlib.figure.Figure)をバイパスすることは可能ですが、インタラクティブなエクスペリエンスを向上させるために図を微調整する必要があります(結局のところ、これはコンビニエンスメソッドです)。

個人的な推奨事項

私は裸の提案plt.plotplt.scatterおそらく使用して、インタラクティブセッションのコンテキストでIPythonをそのと%matplotlib探索Jupyterノートブックのコンテキストでも、魔法のコマンド、および。

一方、オブジェクト指向のアプローチといくつかのplt 便利な方法は、進むべき道です。

  • 微調整されたサブプロットのカスタマイズされた配置ですべてを一度に解決する永続的な問題がある場合は、
  • 作成したプログラムのUIにMatplotlibを埋め込みたい場合。

これらの両極端の間には大きな灰色の領域があり、どうすればよいかと聞かれたら、「状況によって異なります」とだけ言います...


2
「名前の軸は少し誤解を招くと思いますが、おそらくそれは私だけです」-いいえ、それは私でもあります。ただし、変更することはできません。
Laryx Decidua

1
サブプロットが必要ないのになぜ人々がfig, ax = plt.subplot()イディオムを使用するのか理解できないもう1つのこと。そのような場合、私は「手続き型」スタイルの方が簡単だと感じました。「しかし、おそらくそれは私だけです...」:-)
Laryx Decidua

@LaryxDeciduaすぐに2つの理由がわかります①「明示的は暗黙的よりも優れている」②手続き型APIでは使用できないFigureまたはAxesのメソッドを使用したい—しかしおそらく他にもある…
gboffi

はい、完全に購読しています1)。Re 2):ほとんどの場合、手続き型APIで十分です。結局のところ、それは個人的な好みに
要約
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.