如何在matplotlib中的每个子图上嵌入图像?

时间:2017-06-14 17:04:22

标签: python matplotlib imshow

我试图在每个子图的角落放一个小箭头。以下是我使用的示例代码:

import matplotlib.pyplot as plt
import matplotlib.image as image
from numpy import linspace

xs = linspace(0, 1, 100)
im = image.imread('arrow.png')

def multi_plot():
    fig, axes = plt.subplots(4, 1)
    x = 0
    for axis in axes:
        axis.plot(xs, xs**2)
        axis.imshow(im, extent=(0.4, 0.6, .5, .7), zorder=-1, aspect='auto')
    plt.show()

multi_plot()

不幸的是,这产生了4个完全由箭头支配的子图,并且没有看到图。

示例输出 - 错误:

Example output - Incorrect

我需要做什么才能让每个子画面都有一个图像,并且可以看到情节本身?

2 个答案:

答案 0 :(得分:1)

我认为考虑将图像放在一个框中并使用zoom=1参数将其置于图例中是值得考虑的。优点是您根本不需要关心范围和数据坐标。您也不需要处理缩放或平移绘图时发生的情况。此外,它允许保持图像的原始分辨率(import matplotlib.pyplot as plt import matplotlib.image as image from numpy import linspace from matplotlib.offsetbox import OffsetImage,AnchoredOffsetbox xs = linspace(0, 1, 100) im = image.imread('arrow.png') def place_image(im, loc=3, ax=None, zoom=1, **kw): if ax==None: ax=plt.gca() imagebox = OffsetImage(im, zoom=zoom*0.72) ab = AnchoredOffsetbox(loc=loc, child=imagebox, frameon=False, **kw) ax.add_artist(ab) def multi_plot(): fig, axes = plt.subplots(4, 1) for axis in axes: axis.plot(xs, xs**2) place_image(im, loc=2, ax=axis, pad=0, zoom=1) plt.show() multi_plot() 在下面的代码中)。

set404()

enter image description here

答案 1 :(得分:0)

您会注意到x和y轴上的限制已设置为imshow的范围,而不是0-1,您的情节需要查看该线。

您可以使用axis.set_xlim(0, 1)axis.set_ylim(0, 1)来控制这一点。

import matplotlib.pyplot as plt
import matplotlib.image as image
from numpy import linspace

xs = linspace(0, 1, 100)
im = image.imread('arrow.png')

def multi_plot():
    fig, axes = plt.subplots(4, 1)
    x = 0
    for axis in axes:
        axis.plot(xs, xs**2)
        axis.imshow(im, extent=(0.4, 0.6, .5, .7), zorder=-1, aspect='auto')
        axis.set_xlim(0, 1)
        axis.set_ylim(0, 1)
    plt.show()

multi_plot()

enter image description here

或者,如果您想在matplotlib默认使用的数据周围保留5%的额外余量,可以将imshow命令移到plot命令之前,然后后者将控制轴限制。

import matplotlib.pyplot as plt
import matplotlib.image as image
from numpy import linspace

xs = linspace(0, 1, 100)
im = image.imread('arrow.png')

def multi_plot():
    fig, axes = plt.subplots(4, 1)
    x = 0
    for axis in axes:
        axis.imshow(im, extent=(0.4, 0.6, .5, .7), zorder=-1, aspect='auto')
        axis.plot(xs, xs**2)
    plt.show()

multi_plot()

enter image description here