41

私はラテックスに埋め込む出版品質のプロットを作成しており、サイズとフォントに関して非常に正確にしたいと考えています (フォントが記事のサイズとプロットのサイズと同じになるように)。プロットがラテックスでスケーリングされないようにするために、正確なサイズにしたいのですが、できません。これが私のコードです:

import matplotlib.pyplot as plt
from matplotlib import rc, rcParams
from numpy import sin

rc('text', usetex=True)
rc('font', family='serif', serif='Computer Modern Roman', size=8)
rc('legend', fontsize=10)

width_in = 5
fig = plt.figure(1, figsize=(width_in, 2))
ax = fig.add_subplot(111)
ax.plot(range(0,100), sin(range(0,100)))

fig.tight_layout()
fig.savefig('test.eps', bbox_inches='tight', pad_inches=0)
plt.close()

問題は、bbox_inches='tight' および pad_inches=0 にあります。これらのオプションを追加すると、宣言された 5 インチではなく、プロットの幅が 4.76 インチになります。しかし、私は彼らがスペースを節約したい. それで、それを解決する方法は?

編集:ええと、答えは、を削除bbox_inches='tight'pad_inches=0て使用することを示唆していtight_layout()ます. その後、画像は適切なサイズになりますが、まだ白いパディングが残っています。で削除できますfig.tight_layout(pad=0)が、図のタイトルがボックス内に移動し、見苦しくなります。一方で、使用tight_layout(rect=[...])して目的の結果を得ることができますが、数値を正しく取得するのは手作業であり、好きではありません。したがって、現在、私の問題に対する簡単で一般的な解決策は見当たりません。

4

3 に答える 3

34

あなたが抱えている問題はbbox_inches='tight'、図の周りの余分な空白をすべて削除するだけで、実際には図がレンダリングされた後に再配置されないことです。

必要な効果を得るには、tight_layout(チュートリアル) に渡すパラメーターを微調整する必要がある場合があります。

うまくいけば、これで正しい方向に向けることができます。

于 2013-04-16T13:54:24.497 に答える
1

元のプロットには空白が必要です。そうしないと、bbox_inches=tight によって領域が削除されません。これには、私が知っている2つの解決策があります。

  1. 簡単な方法はtight_layout、tcaswell が述べたように使用することです。

  2. より複雑ですが、より制御しやすい方法は、使用を避けfig.add_subplot(111)、代わりに使用fig.add_axes()することです。これにより、軸インスタンスを定義するときに、軸の大きさに関してより厳密にすることができます。次に、軸のサイズを微調整して、5 インチの Figure 領域を維持するために必要なだけの Figure 領域を占めるようにします。これを行ったら、単純に使用しないbbox_inchesか、None (デフォルト) に設定することをお勧めします。不fig.add_axes()必要なクロッピングを回避します。 rect最初の引数として、[left_position, bottom_position, width, height]0 から 1 までの各範囲で構成されるパラメーターが必要です。

編集:tight_layoutチュートリアルをもう一度読んだ後、ほとんどすべてをカバーしていることに気付きました. Figure の縦横比が Axes インスタンスの縦横比と異なっていても、Axes インスタンスの縦横比を簡単に維持できることに気づきませんでした。私は衛星画像を扱い、それをネイティブのセンサー解像度またはそのセンサー解像度の一部として維持しようとするため、軸領域を定義するときに非常に明確にしようとする傾向があります。これには、もう少し制御が必要です。

于 2013-04-16T19:08:45.143 に答える