How to use custom png image marker with plot?

后端 未结 3 2038
隐瞒了意图╮
隐瞒了意图╮ 2020-11-27 19:05

I would like to utilize customer markers in both scatter and line charts. How can I make custom marker out of a PNG file?

相关标签:
3条回答
  • 2020-11-27 19:33

    The other answer may lead to problems when resizing the figure. Here is a different approach, positionning the images inside annotation boxes, which are anchored in data coordinates.

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.offsetbox import OffsetImage, AnnotationBbox
    
    path = "https://upload.wikimedia.org/wikipedia/commons/b/b5/Tango-example_icons.png"
    image = plt.imread(path)[116:116+30, 236:236+30]
    
    x = np.arange(10)
    y = np.random.rand(10)
    
    fig, ax = plt.subplots()
    ax.plot(x,y)
    
    def plot_images(x, y, image, ax=None):
        ax = ax or plt.gca()
    
        for xi, yi in zip(x,y):
            im = OffsetImage(image, zoom=72/ax.figure.dpi)
            im.image.axes = ax
    
            ab = AnnotationBbox(im, (xi,yi), frameon=False, pad=0.0,)
    
            ax.add_artist(ab)
    
    plot_images(x, y, image, ax=ax)
    
    plt.show()
    

    0 讨论(0)
  • 2020-11-27 19:44

    I don't believe matplotlib can customize markers like that. See here for the level of customization, which falls way short of what you need.

    As an alternative, I've coded up this kludge which uses figimage to place images at the line point locations.

    import matplotlib.pyplot as plt
    import matplotlib.image as image
    
    # constant
    dpi = 72
    # read in our png file
    im = image.imread('smile.png')
    image_size = im.shape[1], im.shape[0]
    
    fig = plt.figure(dpi=dpi)
    ax = fig.add_subplot(111)
    # plot our line with transparent markers, and markersize the size of our image
    line, = ax.plot((1,2,3,4),(1,2,3,4),"bo",mfc="None",mec="None",markersize=imageSize[0] * (dpi/ 96))
    # we need to make the frame transparent so the image can be seen
    # only in trunk can you put the image on top of the plot, see this link:
    # http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg14534.html
    ax.patch.set_alpha(0)
    ax.set_xlim((0,5))
    ax.set_ylim((0,5))
    
    # translate point positions to pixel positions
    # figimage needs pixels not points
    line._transform_path()
    path, affine = line._transformed_path.get_transformed_points_and_affine()
    path = affine.transform_path(path)
    for pixelPoint in path.vertices:
        # place image at point, centering it
        fig.figimage(im,pixelPoint[0]-imageSize[0]/2,pixelPoint[1]-imageSize[1]/2,origin="upper")
    
    plt.show()
    

    Produces:

    0 讨论(0)
  • 2020-11-27 19:54

    Following on from Mark's answer. I just thought I would add to this a bit because I tried to run this and it does what I want with the exception of actually displaying the icons on the graph. Maybe something has changed with matplotlib. It has been 4 years.

    The line of code that reads:

    ax.get_frame().set_alpha(0)
    

    does not seem to work, however

    ax.patch.set_alpha(0)
    

    does work.

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