В PHP текст одинарной кавычки рассматривается как строковое значение, а текст двойной кавычки будет анализировать переменные, заменяя и обрабатывая их значение.
$test = "variable";
echo "Hello Mr $test"; // the output would be: Hello Mr variable
echo 'Hello Mr $test'; // the output would be: Hello Mr $test
Здесь двойная кавычка анализирует значение и одинарную кавычку рассматривается как строковое значение (без разбора переменной $ test.)
Это может работать:
import pylab
fig = pylab.figure()
figlegend = pylab.figure(figsize=(3,2))
ax = fig.add_subplot(111)
lines = ax.plot(range(10), pylab.randn(10), range(10), pylab.randn(10))
figlegend.legend(lines, ('one', 'two'), 'center')
fig.show()
figlegend.show()
figlegend.savefig('legend.png')
[/g0]
использовать pylab.figlegend(..)
и get_legend_handles_labels(..)
:
import pylab, numpy
x = numpy.arange(10)
# create a figure for the data
figData = pylab.figure()
ax = pylab.gca()
for i in xrange(3):
pylab.plot(x, x * (i+1), label='line %d' % i)
# create a second figure for the legend
figLegend = pylab.figure(figsize = (1.5,1.3))
# produce a legend for the objects in the other figure
pylab.figlegend(*ax.get_legend_handles_labels(), loc = 'upper left')
# save the two figures to files
figData.savefig("plot.png")
figLegend.savefig("legend.png")
Это может быть сложно, хотя автоматическое получение размера фигуры легенды.
Можно использовать axes.get_legend_handles_labels
для получения описаний дескрипторов и меток от одного объекта axes
и использовать их для добавления их к осям на другом рисунке.
# create a figure with one subplot
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1,2,3,4,5], [1,2,3,4,5], 'r', label='test')
# save it *without* adding a legend
fig.savefig('image.png')
# then create a new image
# adjust the figure size as necessary
figsize = (3, 3)
fig_leg = plt.figure(figsize=figsize)
ax_leg = fig_leg.add_subplot(111)
# add the legend from the previous axes
ax_leg.legend(*ax.get_legend_handles_labels(), loc='center')
# hide the axes frame and the x/y labels
ax_leg.axis('off')
ax_leg.savefig('legend.png')
Если по какой-то причине вы хотите скрыть только метку осей, вы можете использовать:
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
или если по какой-то странной причине вы хотите скрыть рамку осей, но не эти метки вы можете использовать:
ax.set_frame_on(False)
ps: этот ответ был адаптирован из моего ответа на дублирующий вопрос
Вы можете ограничить сохраненную область фигуры рамкой ограничения легенды, используя аргумент 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()
Это автоматически вычисляет размер легенды. Если mode == 1
, код похож на ответ Стива Тьоа, а mode == 2
- аналогичный ответ Андре Хольцнера.
Параметр loc
должен быть установлен на 'center'
, чтобы заставить его работать (но я не знаю, почему это необходимо).
mode = 1
#mode = 2
import pylab
fig = pylab.figure()
if mode == 1:
lines = fig.gca().plot(range(10), pylab.randn(10), range(10), pylab.randn(10))
legend_fig = pylab.figure(figsize=(3,2))
legend = legend_fig.legend(lines, ('one', 'two'), 'center')
if mode == 2:
fig.gca().plot(range(10), pylab.randn(10), range(10), pylab.randn(10), label='asd')
legend_fig = pylab.figure()
legend = pylab.figlegend(*fig.gca().get_legend_handles_labels(), loc = 'center')
legend.get_frame().set_color('0.70')
legend_fig.canvas.draw()
legend_fig.savefig('legend_cropped.png',
bbox_inches=legend.get_window_extent().transformed(legend_fig.dpi_scale_trans.inverted()))
legend_fig.savefig('legend_original.png')
Оригинальная (необрезанная) легенда:
[/g0]
Обрезанная легенда:
[/g1]