Вы можете ограничить сохраненную область фигуры ограничительной рамкой легенды, используя аргумент 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()