代码之家  ›  专栏  ›  技术社区  ›  pleasedontbelong

如何用matplotlib在绘图的拐角处插入一个小图像?

  •  20
  • pleasedontbelong  · 技术社区  · 14 年前

    我使用的是django,我的代码是这样的:

    def get_bars(request)
        ...
        fig = Figure(facecolor='#F0F0F0',figsize=(4.6,4))
        ...
        ax1 = fig.add_subplot(111,ylabel="Valeur",xlabel="Code",autoscale_on=True)
        ax1.bar(ind,values,width=width, color='#FFCC00',edgecolor='#B33600',linewidth=1)
        ...
        canvas = FigureCanvas(fig)
        response = HttpResponse(content_type='image/png')
        canvas.print_png(response)
        return response
    
    1 回复  |  直到 5 年前
        1
  •  54
  •   MPA    5 年前

    如果你想把图像放在实际图形的一角(而不是轴的一角),请查看 figimage .

    也许是这样的?(使用PIL读取图像):

    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

    imshow

    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()
    

    enter image description here

        2
  •  0
  •   germ    4 年前

    现在有一个更简单的方法,使用新的 inset_axes

    此命令允许将一组新轴定义为现有轴的子轴 axes transform 表情。

    下面是一个代码示例:

    # Imports
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    
    # read image file
    with mpl.cbook.get_sample_data(r"C:\path\to\file\image.png") as file:
    arr_image = plt.imread(file, format='png')
    
    # Draw image
    axin = ax.inset_axes([105,-145,40,40],transform=ax.transData)    # create new inset axes in data coordinates
    axin.imshow(arr_image)
    axin.axis('off')
    

    此方法的优点是,当轴被重新缩放时,图像将自动缩放!