在matplotlib图例中插入图像
我想插入一个小graphics(vectorgraphics,但可以制作光栅,如果有必要的话)到一个maplotlib图的图例。 图例中的每个项目都会有一个graphics。
我知道我可以使用类似注释框的方式手动绘制整个图例,但是看起来很乏味,图中任何小小的变化都需要手工修改。
有没有办法在pyplot.plot
或更高版本的pyplot.legend
调用中的标签中包含graphics?
所以,下面是一个小黑客,但它可以让你大部分的方式在那里。 注意:你需要用你想要的图像replace[PATH TO IMAGE]
(否则你可以免费获得Grace Hopper!)。 您还可以通过传递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)
这是它产生的: