2016-03-24 18 views
3

私は自分自身にこの質問をしています:どのようにモジュール式でmatplotlibと簡単に異なるプロットを組み合わせるのですか?2つの独立したプロットをmatplotlibと組み合わせる最良の方法は何ですか?

たとえば、グラフのノードの位置を表示する関数を作成したとしましょう。並行して、ポリゴンをプロットする別の関数を作った。さて、出力を組み合わせる正しい方法は何ですか、ノードはポリゴンの内側にあるように見えますか?個々のプロット全体の透明性、位置などを変更する可能性はどうですか? 2つの初期関数の構造はどうでしょうか?

スマートで一般的なやり方はありますか?

+1

あなたの関数が、伝統的にはaxと呼ばれる軸引数を取るようにしてください。すべてのプロットと描画に 'ax'を使います。私の好みは 'ax'を返すことですが、これはPythonでは必要ではありません。ただ二度渡すだけです。それ以外の場合は、関数を呼び出す順序によって、図面の「上」にあるものが決まります。 – Alan

+0

だから、軸を作成し、最初の関数を入力して最初のものを入力し、軸を出力としてもう一度取得し、2番目の関数を入力して2番目の関数をプロットし、出力として取得して表示する/それを保存? – Benares

答えて

3

ちょうどあなたは、一般的に、これに多少似てあなたのプロット関数を構築したい、@Alanが言ったことについて詳しく説明します

import numpy as np 
import matplotlib.pyplot as plt 

def main(): 
    data = [np.random.random((2, 3)) for _ in range(5)] 
    fig, ax = plt.subplots() 
    plot_polygons(data, alpha=0.5, ax=ax) 
    plot_verts(data, marker='^', color='black', ax=ax) 
    plt.show() 


def plot_polygons(data, ax=None, **kwargs): 
    if ax is None: 
     ax = plt.gca() 

    artists = [ax.fill(x, y, **kwargs) for x, y in data] 
    return artists 

def plot_verts(data, ax=None, **kwargs): 
    if ax is None: 
     ax = plt.gca() 

    artists = [ax.scatter(x, y, **kwargs) for x, y in data] 
    return artists 

main() 

enter image description here

この方法の利点は、あなたが暗黙的に使用できるということですおよび/または自動的に作成します。あなたのプロット関数の内部でax = plt.gca() if ax is None else axに似た何かをすることによって、あなたがしたい場合は、pyplotステート・マシンのスタイルでミックスすることができます:

def main(): 
    data = [np.random.random((2, 3)) for _ in range(5)] 
    plot_polygons(data, alpha=0.5) 
    plot_verts(data, marker='^', color='black') 
    plt.show() 

をそれとも、明示的に一般的により良い方法である(Axesインスタンスを指定することができます)。これは、あなたはさまざまな方法で特定の軸にプロットすることができます:私が作成しているアーティストを返すんだけど、私はまだ例では、それらを使用していない

data = [np.random.random((2, 3)) for _ in range(5)] 

fig, axes = plt.subplots(nrows=2, sharex=True) 

axes[0].set(title='Simple Plot', ylabel='Y-label') 
plot_verts(data, marker='o', ax=axes[0]) 

axes[1].set(title='More complex', xlabel='X-label') 
plot_polygons(data, ax=axes[1], alpha=0.5, color='gray') 
plot_verts(data, ax=axes[1], color='red', marker='s', s=200) 

plt.show() 

enter image description here


注意。ただし、後で必要に応じてプロパティを変更できるため、アーティストに返却することをお勧めします。

たとえば、クリックするとポリゴンを非表示にする簡単なインタラクティブな例を作成しましょう。以前から関数をコピーしてコピー&ペーストすることができる完全な例を作成します:

import numpy as np 
import matplotlib.pyplot as plt 

def main(): 
    data = [np.random.random((2, 3)) for _ in range(5)] 
    fig, ax = plt.subplots() 
    polygons = plot_polygons(data, alpha=0.5, ax=ax, color='gray') 
    verts = plot_verts(data, marker='s', color='red', ax=ax, s=200) 

    def on_click(event): 
     visible = polygons[0][0].get_visible() 
     plt.setp(polygons, visible=not visible) 
     plt.setp(verts, color=np.random.random(3)) 
     plt.draw() 
    fig.canvas.mpl_connect('button_press_event', on_click) 

    ax.set(title='Click on plot to change') 
    plt.show() 


def plot_polygons(data, ax=None, **kwargs): 
    if ax is None: 
     ax = plt.gca() 

    artists = [ax.fill(x, y, **kwargs) for x, y in data] 
    return artists 

def plot_verts(data, ax=None, **kwargs): 
    if ax is None: 
     ax = plt.gca() 

    artists = [ax.scatter(x, y, **kwargs) for x, y in data] 
    return artists 

main() 
+0

ワオ、それは素晴らしい答えです! Pyplotの状態マシンのスタイルに関するコードの2番目のコードは、ジュピターのノートブックを使った素早く汚い組み合わせのプロットについて私の意見では非常に便利ですが、なぜ軸を明示的に使用するのがよりクリーンであるのがわかります。最後の部分も非常に興味深いです、私はこの 'mpl_connect'メソッドを使ったことはありません、私は間違いなく見ています。どうもありがとう。 – Benares

関連する問題