オプションは、軸の目盛りを考慮してFigureを表示しようとしているようです。それを避けるためには、数字の実際の範囲をplt.savefig
メソッドに渡すことができます。
import matplotlib.pyplot as plt
img = plt.imread('myimage.jpg')
ymax, xmax, _ = img.shape
plt.imshow(img, extent=[0,xmax,ymax,0]) # switch to pixel coords
plt.plot([100,200,300],[100,200,300],'ro')
plt.imshow(img, extent=[0,xmax,ymax,0]) # recenter plot
plt.axis('off')
# get figure and axis handle
fig = plt.gcf()
ax = plt.gca()
# get axis extent
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('out.jpg', bbox_inches=extent)
何らかの理由で、図に小さな白い辺を追加したい場合でも、それを行うことができます。ただ従う
extent2 = extent.expanded(1.01, 1.01)
plt.savefig('out.jpg', bbox_inches=extent2)
として範囲を拡大し、他のオプションが完全にmatehat'sの提案を使用して軸の境界オフを取り除くためになります。
import matplotlib.pyplot as plt
img = plt.imread('myimage.jpg')
ymax, xmax, _ = img.shape
my_dpi = 80.
my_figsize = [xmax/my_dpi, ymax/my_dpi]
fig = plt.figure(figsize=my_figsize, dpi=my_dpi)
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
h_im = ax.imshow(img, aspect = 'equal', extent=[0,xmax,ymax,0])
plt.plot([100,200,300],[100,200,300],'ro')
plt.axis(h_im.get_extent())
plt.savefig('out.jpg', dpi = my_dpi)
最終画像は元の画像サイズを持ちますが、2つの画像の間にはサブピクセルの差があります。下の図は、myimage.jpg
とout.jpg
の違いを示しています。
matplotlibのはかなりそれがどのように動作するかの点ではMathWorks社のMATLABと同じなので。 – Vivek