How to insert a small image on the corner of a plot with matplotlib?

后端 未结 1 1532
迷失自我
迷失自我 2020-12-01 07:57

What I want is really simple: I have a small image file called \"logo.png\" that I want to display on the upper left corner of my plots. But you can\'t find any example of t

相关标签:
1条回答
  • 2020-12-01 08:13

    If you want the image at the corner of your actual figure (rather than the corner of your axis), look into figimage.

    Perhaps something like this? (using PIL to read the image):

    import matplotlib.pyplot as plt
    import Image
    import numpy as np
    
    im = Image.open('/home/jofer/logo.png')
    height = im.size[1]
    
    # We need a float array between 0-1, rather than
    # a uint8 array between 0-255
    im = np.array(im).astype(np.float) / 255
    
    fig = plt.figure()
    
    plt.plot(np.arange(10), 4 * np.arange(10))
    
    # With newer (1.0) versions of matplotlib, you can 
    # use the "zorder" kwarg to make the image overlay
    # the plot, rather than hide behind it... (e.g. zorder=10)
    fig.figimage(im, 0, fig.bbox.ymax - height)
    
    # (Saving with the same dpi as the screen default to
    #  avoid displacing the logo image)
    fig.savefig('/home/jofer/temp.png', dpi=80)
    
    plt.show()
    

    alt text

    Another option, if you'd like to have the image be a fixed fraction of the figure's width/height is to create a "dummy" axes and place the image in it with imshow. This way the image's size and position is independent of DPI and the figure's absolute size:

    import matplotlib.pyplot as plt
    from matplotlib.cbook import get_sample_data
    
    im = plt.imread(get_sample_data('grace_hopper.jpg'))
    
    fig, ax = plt.subplots()
    ax.plot(range(10))
    
    # Place the image in the upper-right corner of the figure
    #--------------------------------------------------------
    # We're specifying the position and size in _figure_ coordinates, so the image
    # will shrink/grow as the figure is resized. Remove "zorder=-1" to place the
    # image in front of the axes.
    newax = fig.add_axes([0.8, 0.8, 0.2, 0.2], anchor='NE', zorder=-1)
    newax.imshow(im)
    newax.axis('off')
    
    plt.show()
    

    0 讨论(0)
提交回复
热议问题