6

我有一个显示绘图的 GUI。我想将该图适合现有图像。我使用以下方法在绘图下显示图像:

myaxe.plot(...)
myaxeimage = myaxe.imshow(myimage, axpect='auto', extent=myaxe.axis(), zorder=-1)

我已经可以使用图像的不透明度来玩了

myaxeimage.set_alpha()

现在我希望能够使用 GUI 放大和缩小图像并在图像周围移动,而无需触及现有的绘图和轴,以便将其与我的绘图对齐。换句话说,我想缩放到给定sxsy因子,并将图像的原点放在给定的(x,y)点,剪裁图像的部分超出轴。我怎样才能做到这一点?

4

2 回答 2

7

有一个与 matplotlib 一起分发的水印示例,有点类似。从该代码开始,我们可以进行如下修改:

用于ax.imshow首先绘制图像。我这样做是因为extent参数会影响ax. 由于我们希望最终范围由 控制plt.plot(...),所以我们把它放在最后。

myaximage = ax.imshow(im, aspect='auto', extent=(1,15,0.3,0.7), alpha=0.5, origin='upper', zorder=-1)

代替extent=myaxe.axis(),用于extent控制图像的位置和大小。extent=(1,15,0.3,0.7)将图像放置在(1, 0.3)左下角和右上角的矩形中(15, 0.7)

使用origin='upper'[0,0]数组的索引im放置在范围的左上角。它将被放置在origin='lower'左下角。


import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cbook as cbook
import matplotlib.image as image
np.random.seed(1)
datafile = cbook.get_sample_data('logo2.png', asfileobj=False)
im = image.imread(datafile)
fig, ax= plt.subplots()

myaximage = ax.imshow(im, aspect='auto', extent=(1,15,0.3,0.7), alpha=0.5, zorder=-1)
ax.plot(np.random.rand(20), '-o', ms=20, lw=2, alpha=1.0, mfc='orange')
ax.grid()
plt.show()

在此处输入图像描述


如果要扩展图像并将其剪辑到绘图的范围内,则可能还需要使用ax.set_xlimand ax.set_ylim

myaximage = ax.imshow(im, aspect='auto', extent=(-1,25,0.3,0.7), alpha=0.5, zorder=-1,
                      origin='upper')

ax.plot(np.random.rand(20), '-o', ms=20, lw=2, alpha=1.0, mfc='orange')
ax.set_xlim(0,20)
ax.set_ylim(0,1)

在此处输入图像描述


或者,为了获得更多控制,您可以使用以下命令将图像剪辑到任意路径myaximage.set_clip_path

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cbook as cbook
import matplotlib.image as image
import matplotlib.patches as patches
np.random.seed(1)
datafile = cbook.get_sample_data('logo2.png', asfileobj=False)
im = image.imread(datafile)
fig, ax= plt.subplots()

myaximage = ax.imshow(im, aspect='auto', extent=(-5,25,0.3,0.7), 
                      alpha=0.5, origin='upper',
                      zorder=-2)
# patch = patches.Circle((300,300), radius=100)
patch = patches.Polygon([[5, 0.4], [15, 0.4], [15, 0.6], [5, 0.6]], closed=True,
                        transform=ax.transData)
myaximage.set_clip_path(patch)
ax.plot(np.random.rand(20), '-o', ms=20, lw=2, alpha=1.0, mfc='orange', 
        zorder=-1)

ax.set_xlim(0, 20)
ax.set_ylim(0, 1)

plt.show()

在此处输入图像描述

于 2013-05-24T20:24:11.847 回答
0

最后,我遵循了 tcaswell 的建议并使用了 2 个不同的轴。这样,我只需使用图像轴set_xlim()set_ylim()图像轴来更改图像的原点和/或缩放因子。我为了得到我的情节下方的图像,而不用情节的框架隐藏它,我删除了情节的框架并使用了图像轴的框架。我还隐藏了图像轴的刻度。

from matplotlib import pyplot

f = pyplot.figure()
a = f.add_subplot(111, frameon=False) # Remove frame
a.plot(...)

myimg = pyplot.imread(...)
imgaxes = f.add_axes(a.get_position(), # new axes with same position
    label='image', # label to ensure imgaxes is different from a
    zorder=-1, # put image below the plot
    xticks=[], yticks=[]) # remove the ticks
img = imgaxes.imshow(myimg, aspect='auto') # ensure image takes all the place

# now, to modify things
img.set_alpha(...)
imgaxes.set_xlim((x1, x2)) # x1 and x2 must be calculated from
                           # image size, origin, and zoom factor
于 2013-05-28T13:55:46.780 回答