Вы можете ограничить сохраненную область фигуры рамкой ограничения легенды, используя аргумент bbox_inches
в fig.savefig
. Ниже вариантов функции, которую вы можете просто вызвать с легендой, которую вы хотите сохранить в качестве аргумента. Вы можете использовать легенду, созданную на исходном рисунке здесь (и удалить ее впоследствии, legend.remove()
), или вы можете создать новую фигуру для легенды и просто использовать функцию как есть.
Если полная легенда будет сохранена, ограничивающая рамка, предоставленная аргументу bbox_inches
, будет просто преобразованной ограничивающей рамкой легенды. Это хорошо работает, если легенда не имеет границы вокруг него.
import matplotlib.pyplot as plt
colors = ["crimson", "purple", "gold"]
f = lambda m,c: plt.plot([],[],marker=m, color=c, ls="none")[0]
handles = [f("s", colors[i]) for i in range(3)]
labels = colors
legend = plt.legend(handles, labels, loc=3, framealpha=1, frameon=False)
def export_legend(legend, filename="legend.png"):
fig = legend.figure
fig.canvas.draw()
bbox = legend.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
fig.savefig(filename, dpi="figure", bbox_inches=bbox)
export_legend(legend)
plt.show()
Если есть является границей вокруг легенды, вышеупомянутое решение может быть неоптимальным. В этом случае имеет смысл расширить ограничительную рамку на несколько пикселей, чтобы включить границу в ее полную.
import numpy as np
import matplotlib.pyplot as plt
colors = ["crimson", "purple", "gold"]
f = lambda m,c: plt.plot([],[],marker=m, color=c, ls="none")[0]
handles = [f("s", colors[i]) for i in range(3)]
labels = colors
legend = plt.legend(handles, labels, loc=3, framealpha=1, frameon=True)
def export_legend(legend, filename="legend.png", expand=[-5,-5,5,5]):
fig = legend.figure
fig.canvas.draw()
bbox = legend.get_window_extent()
bbox = bbox.from_extents(*(bbox.extents + np.array(expand)))
bbox = bbox.transformed(fig.dpi_scale_trans.inverted())
fig.savefig(filename, dpi="figure", bbox_inches=bbox)
export_legend(legend)
plt.show()