Python 如何从matplotlib一次导出一个图例标记?

Python 如何从matplotlib一次导出一个图例标记?,python,matplotlib,export,export-to-pdf,Python,Matplotlib,Export,Export To Pdf,我有一个matplotlib图例,如下所示: 将标记导出为单独的.pdf文件的简单方法是什么?换句话说,我想得到三个独立的.pdf,一个是蓝色的X,一个是金色的+,等等 最终我想做的是在Latex图形标题中的内联图例中使用这些标记,但我想我会在Latex SE网站上询问该部分。将图例句柄导出到文件的想法是将创建的图形保存为pdf,但将其裁剪到感兴趣的部分 这可以通过在调用savefig plt.savefig("file.pdf", dpi="figure", bbox_inches=bbox

我有一个matplotlib图例,如下所示:

将标记导出为单独的.pdf文件的简单方法是什么?换句话说,我想得到三个独立的.pdf,一个是蓝色的X,一个是金色的+,等等


最终我想做的是在Latex图形标题中的内联图例中使用这些标记,但我想我会在Latex SE网站上询问该部分。

将图例句柄导出到文件的想法是将创建的图形保存为pdf,但将其裁剪到感兴趣的部分

这可以通过在调用
savefig

plt.savefig("file.pdf", dpi="figure", bbox_inches=bbox )
现在我们只需要找到要使用的边界框。这可以通过为每个图例控制柄找到
绘图区域
,并将其边界框转换为以英寸为单位的坐标来完成。这是在下面代码中的一个函数
export\u legend\u handles
中完成的

不幸的是,在编写代码时,我发现标记可能实际超过了
绘图区域。由于我还没有找到一种自动方法来查找
绘图区域以外的句柄的实际大小,因此可能需要手动将边界框扩展/缩小一些像素。为此,下面的函数有一个参数
d
,它允许设置那些像素偏移,对于这个测试用例,我已经输入了一些合适的值

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(422)

x = np.arange(12)
a = np.random.rand(len(x), 3)

markers=["x", "+", "o"]
fig, ax = plt.subplots()
for i in range(a.shape[1]):
    ax.plot(x, a[:,i], linestyle="", marker=markers[i], label=markers[i]*6)

leg = ax.legend(framealpha=1)

def export_legend_handles(fig, leg, filename=None, ext=[".pdf", ".png"], d = [0,0,0,3]):
    """ d = [left, bottom, right, top] pixel to add in the respective dimension """
    import matplotlib.transforms as mtransforms
    boxes = []
    fig.canvas.draw()
    trans = fig.dpi_scale_trans.inverted()
    for vpack in leg._legend_handle_box.get_children():
        for hpack in vpack.get_children():
            drawbox = hpack.get_children()[0]
            w, h, xd, yd = drawbox.get_extent(fig.canvas.get_renderer())
            ox, oy = drawbox.get_offset()  
            pixbox = mtransforms.Bbox.from_bounds(ox-d[0],oy-d[1],w+d[0]+d[2],h+d[1]+d[3])
            inchbox = pixbox.transformed(trans) 
            boxes.append(inchbox)

    filename = filename if filename else __file__[:-3]
    for i, box in enumerate(boxes):
        for ex in ext:
            plt.savefig(filename+str(i)+ex, dpi="figure", bbox_inches=box)

export_legend_handles(fig, leg, d = [-5,0,-5,3])
plt.show()
这将生成如下所示的绘图

并将图例句柄保存为pdf和png图像,如下所示


不幸的是,对于更复杂的图形,这不适用于我,因为标记最终位于非常不同的垂直位置。通过添加
linestyles=[“-”、“-”、“-”、“-”]
并将
marker=markers[i]
替换为
linestyle=linestyles[i]
,可以重现这种情况。将生成的三个PDF并排放置,您会注意到这三条线的高度不同。这里的区别很微妙,但在我的另一个情节中却非常巨大。@Bastian这个答案会给你足够的背景知识,让你了解如何导出标记。如果它不适合你,你可以问一个新问题。