Matplotlib:将图像嵌入几个子图()

时间:2017-02-16 06:56:40

标签: python matplotlib

我希望使用matplotlib生成一个多图,并在每个子图的角落嵌入一个图像。

我已经能够使用following example of the matplotlib documentation(下面提供的代码)在(单个)情节图中嵌入图像。

我现在正试图在一系列子图的每个角落嵌入一个图像。我似乎找不到类似于上一个例子所依据的图add_axes()的功能。

我怎样才能达到理想的布局?

import pylab as plt
from numpy import linspace
from matplotlib.cbook import get_sample_data
from scipy.misc import imread

xs = linspace(0, 1, 100)

def single_plot():
    fig, ax = plt.subplots()
    ax.plot(xs, xs**2)

    fn = get_sample_data("grace_hopper.png", asfileobj=False)
    image_axis = fig.add_axes([0.65, 0.70, 0.3, 0.2], anchor='NE', zorder=10)
    image_axis.imshow(imread(fn))

    plt.show()
    plt.clf()

def multi_plot():
    fig, axes = plt.subplots(4)
    for axis in axes:
        axis.plot(xs, xs**2)
        # How to draw the same image as before in the corner of each subplot ?
    plt.show()

if __name__ == '__main__':
    single_plot()
    multi_plot()

1 个答案:

答案 0 :(得分:2)

您可以使用相同的方法在多个子图上叠加图像。必须为要覆盖的每个图像定义相对于图形整体的轴位置。以下是使用代码和Matplotlib文档的简单示例。

def multi_plot():
    fig, axes = plt.subplots(4, 1, figsize=(8, 10))
    fn = get_sample_data("grace_hopper.png", asfileobj=False)
    image = plt.imread(fn)
    x = 0
    for axis in axes:
        axis.plot(xs, xs**2)

        # [left, bottom, width, height]
        image_axis = fig.add_axes([0.125, 0.25 + x, 0.15, 0.65], 
                              zorder=10, anchor="N")
        image_axis.imshow(image)
        image_axis.axis('off')
        x -= 0.209

    plt.show()

我选择逐渐减小新轴相对于图底部的位置。您还可以为要添加的每个图像叠加指定精确位置。

上面的代码产生了一个如下图: Image Overlay Subplots