5

Matplotlib の savefig() 関数で bbox_inches = 'tight' を設定すると、Figure ウィンドウのすべてのコンテンツをカプセル化する最も狭い境界ボックスを見つけようとします。残念ながら、最も狭い境界ボックスには、目に見えない軸が含まれているようです。

たとえば、次のスニペットでは、設定 bbox_inches = 'tight' が希望どおりに機能します。

import matplotlib.pylab as plt
fig = plt.figure(figsize = (5,5))
data_ax = fig.add_axes([0.2, 0.2, 0.6, 0.6])
data_ax.plot([1,2], [1,2])
plt.savefig('Test1.pdf', bbox_inches = 'tight', pad_inches = 0)

これは以下を生成します:

タイトなバウンディングボックス

保存された pdf の境界は、コンテンツの境界に対応します。これは素晴らしいことですが、注釈を配置するために一連の非表示の図の軸を使用するのが好きです。非表示の軸が表示されているコンテンツの境界を超えている場合、pdf の境界は表示されているコンテンツよりも大きくなります。例えば:

import matplotlib.pylab as plt
fig = plt.figure(figsize = (5,5))
fig_ax = fig.add_axes([0, 0, 1, 1], frame_on = False)
fig_ax.xaxis.set_visible(False)
fig_ax.yaxis.set_visible(False)
data_ax = fig.add_axes([0.2, 0.2, 0.6, 0.6])
data_ax.plot([1,2], [1,2])
plt.savefig('Test2.pdf', bbox_inches = 'tight', pad_inches = 0)

生産

緩いバウンディング ボックス

Figure ウィンドウの非表示項目を無視するように savefig() を強制するにはどうすればよいですか? 私が思いついた唯一の解決策は、境界ボックスを自分で計算し、bbox を明示的に savefig() に指定することです。

念のため、Mac OS X 10.8.5 の Python 2.7.3 で Matplotlib 1.2.1 を実行しています。

4

2 に答える 2

3

関連する関数 (バウンディング ボックスを生成するためにcanvas.print_figureによって呼び出される によって呼び出される) :figure.savefigbackend_bases.py

def get_tightbbox(self, renderer):
    """
    Return a (tight) bounding box of the figure in inches.

    It only accounts axes title, axis labels, and axis
    ticklabels. Needs improvement.
    """

    bb = []
    for ax in self.axes:
        if ax.get_visible():
            bb.append(ax.get_tightbbox(renderer))

    _bbox = Bbox.union([b for b in bb if b.width != 0 or b.height != 0])

    bbox_inches = TransformedBbox(_bbox,
                                  Affine2D().scale(1. / self.dpi))

    return bbox_inches

軸が「可視」であるかどうかを決定する唯一の考慮事項は、軸に可視 (または単純な透明) のアーティスト ax.get_visible()がいない場合でも true を返すかどうかです。artist.get_visible() == False

観察したバウンディング ボックスの動作は正しい動作です。

于 2013-10-12T15:30:18.417 に答える
1

tcaswell、助けてくれてありがとう。私の最初の質問は、「savefig() に Figure ウィンドウの非表示アイテムを無視させるにはどうすればよいですか?」 でした。私が置くと、目に見えない軸は無視fig_ax.set_visible(False)されます。savefig()残念ながら、設定するとfig_ax.set_visible(False)、fig_ax に配置されたアーティストも非表示になります。fig_ax存在しない、投稿した元のプロットに戻りました。

あなたのコメントでほのめかしたように、tcaswell、適切な解決策は作成を避けることだと思いますfig_ax. 現在、注釈とデータ軸ラベルをデフォルトの図オブジェクトに配置する作業を行っていますfigfigmm単位ではなく正規化された数値単位を使用するので少し面倒ですが、私はそれを処理できます.

于 2013-10-13T03:01:09.170 に答える