복붙노트

[PYTHON] matplotlib 범례에 이미지 삽입

PYTHON

matplotlib 범례에 이미지 삽입

maplotlib 플롯의 전설에 몇 개의 작은 그래픽 (벡터 그래픽은 필요하면 래스터 화 가능)을 삽입하고 싶습니다. 범례에는 항목 당 하나의 그래픽이 있습니다.

주석 상자와 같은 것을 사용하여 수동으로 전체 범례를 그릴 수는 있지만 지루한 것처럼 보입니다. 그림의 작은 변화는 손으로 고정해야합니다.

pyplot.legend 호출에서 pyplot.plot 또는 나중에 호출 할 때 라벨에 그래픽을 포함 할 수있는 방법이 있습니까?

해결법

  1. ==============================

    1.그래서, 아래는 조금 해키지만, 거기에 당신을 얻을 수있는 방법. 참고 : [PATH TO IMAGE]를 원하는 이미지로 바꿔야합니다 (그렇지 않으면 Grace 호퍼가 무료로 제공됩니다). image_stretch 매개 변수를 전달하여 이미지를 기본값보다 크게 만들 수도 있습니다. 이것은 이미지의 가로 세로 비율을 수정하는 해킹 방법입니다. 이미지가 한 시리즈에서 다음 시리즈로 겹치면 labelspacing 매개 변수를 사용하십시오.

    그래서, 아래는 조금 해키지만, 거기에 당신을 얻을 수있는 방법. 참고 : [PATH TO IMAGE]를 원하는 이미지로 바꿔야합니다 (그렇지 않으면 Grace 호퍼가 무료로 제공됩니다). image_stretch 매개 변수를 전달하여 이미지를 기본값보다 크게 만들 수도 있습니다. 이것은 이미지의 가로 세로 비율을 수정하는 해킹 방법입니다. 이미지가 한 시리즈에서 다음 시리즈로 겹치면 labelspacing 매개 변수를 사용하십시오.

    import os
    
    from matplotlib.transforms import TransformedBbox
    from matplotlib.image import BboxImage
    from matplotlib.legend_handler import HandlerBase
    from matplotlib._png import read_png
    
    class ImageHandler(HandlerBase):
        def create_artists(self, legend, orig_handle,
                           xdescent, ydescent, width, height, fontsize,
                           trans):
    
            # enlarge the image by these margins
            sx, sy = self.image_stretch 
    
            # create a bounding box to house the image
            bb = Bbox.from_bounds(xdescent - sx,
                                  ydescent - sy,
                                  width + sx,
                                  height + sy)
    
            tbb = TransformedBbox(bb, trans)
            image = BboxImage(tbb)
            image.set_data(self.image_data)
    
            self.update_prop(image, orig_handle, legend)
    
            return [image]
    
        def set_image(self, image_path, image_stretch=(0, 0)):
            if not os.path.exists(image_path):
                sample = get_sample_data("grace_hopper.png", asfileobj=False)
                self.image_data = read_png(sample)
            else:
                self.image_data = read_png(image_path)
    
            self.image_stretch = image_stretch
    
    # random data
    x = np.random.randn(100)
    y = np.random.randn(100)
    y2 = np.random.randn(100)
    
    # plot two series of scatter data
    s = plt.scatter(x, y, c='b')
    s2 = plt.scatter(x, y2, c='r')
    
    # setup the handler instance for the scattered data
    custom_handler = ImageHandler()
    custom_handler.set_image("[PATH TO IMAGE]",
                             image_stretch=(0, 20)) # this is for grace hopper
    
    # add the legend for the scattered data, mapping the
    # scattered points to the custom handler
    plt.legend([s, s2],
               ['Scatters 1', 'Scatters 2'],
               handler_map={s: custom_handler, s2: custom_handler},
               labelspacing=2,
               frameon=False)
    

    여기에 그것이 무엇을 생산하고 있습니다 :

  2. from https://stackoverflow.com/questions/26029592/insert-image-in-matplotlib-legend by cc-by-sa and MIT license