web-dev-qa-db-ja.com

matplotlib:plotとimshowを同じ軸で使用する場合の制限

楕円をimshowプロットにプロットしようとしています。それは機能しますが、画像をプロットした後に楕円をプロットすると、xlimとylimが増加し、境界線が発生するようです。

Imshowのみを呼び出した直後は、白い境界線がないことに注意してください。

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

self.dpi = 100
self.fig = Figure((6.0, 6.0), dpi=self.dpi)
self.canvas = FigureCanvas(self.fig)
self.canvas.setMinimumSize(800, 400)
self.cax = None
self.axes = self.fig.add_subplot(111)
self.axes.imshow(channel1, interpolation="nearest")
self.canvas.draw()
self.axes.plot(dat[0], dat[1], "b-")

「plot」を呼び出す前後に制限を設定しようとしましたが、効果はありませんでした

# get limits after calling imshow
xlim, ylim = pylab.xlim(), pylab.ylim()
...
# set limits before/after calling plot
self.axes.set_xlim(xlim)
self.axes.set_ylim(ylim)

どうすれば既存の数値制限を増加させないようにプロットを強制できますか?

Solution(thanks to Joe):

#for newer matplotlib versions
self.axes.imshow(channel1, interpolation="nearest")
self.axes.autoscale(False)
self.axes.plot(dat[0], dat[1], "b-")

#for older matplotlib versions (worked for me using 0.99.1.1)
self.axes.imshow(channel1, interpolation="nearest")
self.axes.plot(dat[0], dat[1], "b-", scalex=False, scaley=False)
22
soramimo

何が起こっているのかは、プロットする各アイテムの範囲と一致するように軸が自動スケーリングされることです。画像はラインなどよりもはるかにタイトに自動スケーリングされます(imshowは基本的にax.axis('image')を呼び出します)。

前に軸の制限を取得し、後に設定することはうまくいくはずです。 (ただし、前にlimits = axes.axis()を実行し、後にaxes.axis(limits)を実行する方がきれいです。)

ただし、自動スケーリングを行わない場合は、最初のプロットの後に自動スケーリングをオフにすることをお勧めします。画像をプロットした後、axes.autoscale(False)を試してください。

例として、これを比較してください:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
ax.imshow(np.random.random((10,10)))
ax.plot(range(11))
plt.show()

enter image description here


これとともに:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
ax.imshow(np.random.random((10,10)))
ax.autoscale(False)
ax.plot(range(11))
plt.show()

enter image description here

32
Joe Kington