python - 如何一次从 matplotlib 中导出一个图例标记?

标签 python matplotlib export export-to-pdf

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

enter image description here

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

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

最佳答案

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

这可以通过指定边界框来完成 bboxbbox_inches调用中的参数 savefig

plt.savefig("file.pdf", dpi="figure", bbox_inches=bbox )

现在我们只需要找出要使用的边界框。这可以通过找到 DrawingArea 来完成。对于每个图例句柄并将其边界框转换为以英寸为单位的坐标。这是在函数 export_legend_handles 中完成的在下面的代码中。

不幸的是,在编写该代码时,我发现标记可能实际上超出了 DrawingArea。 .因为我还没有找到一种自动方法来找到 DrawingArea 之外的句柄的实际大小。 ,可能需要手动扩展/缩小边界框一些像素。为此,下面的函数有一个参数 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()

这会产生如下图

enter image description here

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

enter image description here

关于python - 如何一次从 matplotlib 中导出一个图例标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43021593/

相关文章:

r - 将大矩阵保存为 csv 文件 - excel 中多行的标题

python - Pandas - 获取日期和当前时间之间的营业时间

python - numpy 张量相关问题

Python 将数据绘制为环中角度的函数

python - 创建一个 fiddle 图的正确方法是什么,其中一把 fiddle 按色调分开?

mysql - 在 MySQL Workbench 中将数据从一种模式导出到另一种模式

csv - MysqlDump 为 CSV 格式。 (封闭的字符串字段,第一个描述行,没有 sql 文件)

python - 如何删除初始 wx.RadioBox 选择?

python - pandas 数据框中的新列,其值逐步增加

python - Python 中的 3D 绘图 - 向散点图添加图例