Matplotlib:如何绘制图像而不是点?

时间:2014-03-21 18:04:23

标签: python image-processing matplotlib

我想将图像列表读入Python / Matplotlib,然后在图形中绘制此图像而不是其他标记(如点)。我尝试过imshow但是我没有成功,因为我不能将图像移动到另一个位置并适当地缩放它。也许有人有个好主意:) It should look somehow like this! (Without the Spongebob, but with very serious data of course!)

2 个答案:

答案 0 :(得分:37)

有两种方法可以做到这一点。

  1. 使用imshow根据您想要图片的位置设置extent kwarg来绘制图像。
  2. OffsetImage内使用AnnotationBbox
  3. 第一种方式是最容易理解的,但第二种方式具有很大的优势。 k注释框方法将允许图像在放大时保持恒定大小。使用imshow会将图像的大小与图的数据坐标联系起来。

    以下是第二个选项的示例:

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.offsetbox import OffsetImage, AnnotationBbox
    from matplotlib.cbook import get_sample_data
    
    def main():
        x = np.linspace(0, 10, 20)
        y = np.cos(x)
        image_path = get_sample_data('ada.png')
        fig, ax = plt.subplots()
        imscatter(x, y, image_path, zoom=0.1, ax=ax)
        ax.plot(x, y)
        plt.show()
    
    def imscatter(x, y, image, ax=None, zoom=1):
        if ax is None:
            ax = plt.gca()
        try:
            image = plt.imread(image)
        except TypeError:
            # Likely already an array...
            pass
        im = OffsetImage(image, zoom=zoom)
        x, y = np.atleast_1d(x, y)
        artists = []
        for x0, y0 in zip(x, y):
            ab = AnnotationBbox(im, (x0, y0), xycoords='data', frameon=False)
            artists.append(ax.add_artist(ab))
        ax.update_datalim(np.column_stack([x, y]))
        ax.autoscale()
        return artists
    
    main()
    

    enter image description here

答案 1 :(得分:7)

如果您要使用其他图像:

这是谷歌搜索“ matplotlib散布图像”时的第一个答复。如果您像我一样,实际上需要在每个图像上绘制不同的图像,请尝试使用此最小化示例。只需确保输入自己的图像即可。

import matplotlib.pyplot as plt
from matplotlib.offsetbox import OffsetImage, AnnotationBbox

def getImage(path):
    return OffsetImage(plt.imread(path))

paths = [
    'a.jpg',
    'b.jpg',
    'c.jpg',
    'd.jpg',
    'e.jpg']

x = [0,1,2,3,4]
y = [0,1,2,3,4]

fig, ax = plt.subplots()
ax.scatter(x, y) 

for x0, y0, path in zip(x, y,paths):
    ab = AnnotationBbox(getImage(path), (x0, y0), frameon=False)

enter image description here