将bbox_inches设置为“ tight”进行保存会更改显示坐标

时间:2018-09-20 11:39:52

标签: python matplotlib drawing

我的问题是对this question的一种跟进。 我使用接受的答案中提出的解决方案将一些图像作为刻度标签:

import matplotlib.pyplot as plt
import matplotlib.patches as patches
from matplotlib.image import BboxImage,imread
from matplotlib.transforms import Bbox

# define where to put symbols vertically
TICKYPOS = -.6

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(range(10))
plt.xlim((0,10))
plt.ylim((0,10))

# Remove tick labels
ax.get_xaxis().set_ticklabels([])

# Go from data coordinates to display coordinates
lowerCorner = ax.transData.transform((.8,TICKYPOS-.2))
upperCorner = ax.transData.transform((1.2,TICKYPOS+.2))

bbox_image = BboxImage(Bbox([lowerCorner,upperCorner]),
                       norm = None,
                       origin=None,
                       clip_on=False)

bbox_image.set_data(imread('thumb.png'))

ax.add_artist(bbox_image)

其中thumb.png是我想作为刻度标签放置的图像的示例。

然后我用plt.savefig("bbox_large.png")保存图像,它可以正常工作: Intended result, thumb.png is correctly positioned.

不幸的是,图片周围仍有很多空白。我尝试使用plt.savefig("bbox_tight.png",bbox_inches='tight')删除它。但是,定位变得混乱了:

thumb.png is not correctly positioned anymore.


就我对matplotlib的理解而言,问题在于bbox_inches='tight'的{​​{1}}选项实际上会更改显示坐标系,即原点不在同一位置。该图以某种方式正确显示,但似乎添加到轴上的艺术家的坐标不会自动更新。

我尝试使用以下方法来考虑额外的艺术家:

savefig

但结果相同。

我还尝试使用event manager手动更新显示坐标:

plt.savefig("bbox_tight_extra.png",bbox_extra_artists=[bbox_image],bbox_inches='tight')

但它也给出相同的结果。我认为这是因为我没有显式使用import matplotlib.pyplot as plt import matplotlib.patches as patches from matplotlib.image import BboxImage,imread from matplotlib.transforms import Bbox def ondraw(event): # Go from data coordinates to display coordinates lowerCorner = ax.transData.transform((.8,TICKYPOS-.2)) upperCorner = ax.transData.transform((1.2,TICKYPOS+.2)) bbox_image = BboxImage(Bbox([lowerCorner,upperCorner]), norm = None, origin=None, clip_on=False) bbox_image.set_data(imread('thumb.png')) ax.add_artist(bbox_image) # define where to put symbols vertically TICKYPOS = -.6 fig = plt.figure() ax = fig.add_subplot(111) ax.plot(range(10)) plt.xlim((0,10)) plt.ylim((0,10)) # Remove tick labels ax.get_xaxis().set_ticklabels([]) fig.canvas.mpl_connect('draw_event', ondraw) 变量,因此没有使用更新的显示坐标系,也就是说,我使用的event不是正确的变量。


如何避免图像的位置被transData弄乱?

0 个答案:

没有答案