6

私は iPython ノートブックを matplotlib と一緒によく使用しますが、喜んで imshow() を呼び出すと自動的に画像が表示されるケースがたくさんありますが、その動作を防止したい場合があります。

具体的には、非常に大きな配列をループして、ディスクに保存する必要がある要素ごとに matplotlib で図を生成します。その図の作成の一環として、 imshow() を呼び出して既存の画像 (私の場合はマップのスクリーンショット) を軸に描画し、後でその上に追加のマテリアルを描画する必要があります。プロセスの一部として imshow を呼び出すたびに、最終的な図が iPython ノートブックにインラインで表示されますが、どうすればそれを防ぐことができますか?

私のコードは次のようになります。

import matplotlib as plt
fig = plt.pyplot.figure(figsize=(20,20))
im2 = plt.pyplot.imread('/some/dir/fancy-map.png')

# Magic to calculate points, x_min etc.

fig.clf()
ax = fig.gca(xlim=(x_min, x_max), ylim=(y_min, y_max))
ax.imshow(im2, extent=(4, 4.5746, 42.5448, 43.3791), aspect=1.5)
raster = ax.imshow(points, vmin = 0, vmax=maxval, extent=(x_min, x_max, y_min, y_max), aspect=1.5, origin='lower')
fig.colorbar(raster)
ax.set_title('coordinates plot')

fig.savefig("fancy-annotated-map.png", bbox_inches=0)
4

1 に答える 1

4

これを関数に移動してみてください。関数の開始時に dopylab.ioff()を実行し、最後に に戻りpylab.ion()ます。

# Obvs add arguments so you can pass in your data and plot choices.
def make_img():
    pylab.ioff()

    import matplotlib as plt
    fig = plt.pyplot.figure(figsize=(20,20))
    im2 = plt.pyplot.imread('/some/dir/fancy-map.png')

    # Magic to calculate points, x_min etc.

    fig.clf()
    ax = fig.gca(xlim=(x_min, x_max), ylim=(y_min, y_max))
    ax.imshow(im2, extent=(4, 4.5746, 42.5448, 43.3791), aspect=1.5)
    raster = ax.imshow(points, 
                       vmin = 0, 
                       vmax=maxval, 
                       extent=(x_min, x_max, y_min, y_max), 
                       aspect=1.5, 
                       origin='lower')
    fig.colorbar(raster)
    ax.set_title('coordinates plot')
    fig.savefig("fancy-annotated-map.png", bbox_inches=0)

    pylab.ion()
  1. これは、関数を IPython 内でのみ使用しているか、それ以外の場合pylabは常にインポートされていることを前提としています。関数を他の場所で使用できるように、 try...をラップすることをお勧めします。except

  2. 独自の IPython Magic 関数(%または%%関数呼び出し、 など) を作成するためのテンプレートをご覧ください%cpaste%imnoshowこれに対する適切なアプローチは、を呼び出す部分だけをラップするような独自のマジックを作成することです。これにより、出力を見ることなく出力imshowのインライン処理を行うことができます。imshowあなたの質問は一般的なプロットインターフェイスではなく、この特定のものを扱っているので、ここではこれを実装しようとはしませんが、必要に応じて何かを実装できるように上記のリンクで十分であることを願っています。

  3. 別のアプローチは、独自のIPython 構成環境をセットアップするための指示に従うことです。これには、独自のインポートやヘルパー クラス定義などでいっぱいの特定.pyのファイルを用意することも含まれます。次に、独自の特別なプロット関数をそこに配置して、起動時に読み込まれるようにします。 IPython ではグローバル スコープで使用できます。いくつかの理由から、これを強くお勧めします: (a) 独自のヘルパー関数の単体テストを実際に記述でき、必要に応じて IPython を起動するたびに簡単にテストすることもできます! (b) これにより、バージョン管理がより簡単になり、頻繁に必要になるヘルパー関数のロジックをカプセル化できます。(c) 魔法の関数にしたり、後でインポートしたりする必要なく、「ただそこにある」関数の利点を得ることができます。

于 2013-11-14T16:40:57.620 に答える