Я знаком со следующими вопросами:
Matplotlib savefig с легендой вне сюжета
Кажется, что ответы на эти вопросы могут позволить себе роскошь возиться с точным сжатием оси, чтобы легенда подходила.
Однако сжатие осей не является идеальным решением, поскольку оно уменьшает размер данных, затрудняя их интерпретацию; особенно когда это сложно и происходит много всего ... отсюда и нужна большая легенда
Пример сложной легенды в документации демонстрирует необходимость в этом, потому что легенда на их графике фактически полностью скрывает несколько точек данных.
http://matplotlib.sourceforge.net/users/legend_guide.html#legend-of-complex-plots
То, что я хотел бы сделать, это динамически увеличивать размер поля рисунка, чтобы приспособить расширяющуюся легенду фигуры.
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-2*np.pi, 2*np.pi, 0.1)
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(x, np.sin(x), label='Sine')
ax.plot(x, np.cos(x), label='Cosine')
ax.plot(x, np.arctan(x), label='Inverse tan')
lgd = ax.legend(loc=9, bbox_to_anchor=(0.5,0))
ax.grid('on')
Обратите внимание, что окончательный ярлык «Обратный загар» на самом деле находится за рамкой рисунка (и выглядит плохо обрезанным, а не качеством публикации!)
Наконец, мне сказали, что это нормальное поведение в R и LaTeX, поэтому я немного запутался, почему это так сложно в python ... Есть ли историческая причина? Матлаб одинаково беден в этом вопросе?
У меня есть (только немного) более длинная версия этого кода на pastebin http://pastebin.com/grVjc007
источник
tight_layout()
должно быть изменено, чтобы принять во внимание легенды.Ответы:
Извините, EMS, но на самом деле я только что получил другой ответ из списка рассылки matplotlib (Спасибо Бенджамину Руту).
Код, который я ищу, настраивает вызов savefig на:
Похоже, это похоже на вызов тугой-тройки, но вместо этого вы позволяете savefig учитывать дополнительных исполнителей в расчете. Это на самом деле изменило размер фигуры по желанию.
Это производит:
[править] Цель этого вопроса состояла в том, чтобы полностью избежать использования произвольных координатных размещений произвольного текста, что было традиционным решением этих проблем. Несмотря на это, в последнее время многочисленные исправления настаивали на их внесении, часто так, чтобы код вызывал ошибку. Теперь я исправил ошибки и исправил произвольный текст, чтобы показать, как они также учитываются в алгоритме bbox_extra_artists.
источник
plt.show()
это сделать. Любое исправление для этого?fig.legend()
метод , действительно странно.Добавлено: я нашел кое-что, что должно было бы помочь, но остальная часть кода ниже также предлагает альтернативу.
Используйте
subplots_adjust()
функцию, чтобы переместить нижнюю часть субплота вверх:Затем поиграйте со смещением в
bbox_to_anchor
части легенды команды легенды, чтобы получить поле легенды там, где вы хотите. Некоторая комбинация установкиfigsize
и использованияsubplots_adjust(bottom=...)
должна создать качественный график для вас.Альтернатива: я просто изменил строку:
чтобы:
и изменился
в
и это хорошо отображается на моем экране (24-дюймовый ЭЛТ-монитор).
Здесь
figsize=(M,N)
устанавливает окно рисунка, чтобы быть M дюймов на N дюймов. Просто играйте с этим, пока он не станет подходящим для вас. Преобразуйте его в более масштабируемый формат изображения и используйте GIMP для редактирования, если это необходимо, или просто обрежьте его с помощьюviewport
опции LaTeX при включении графики.источник
Вот еще одно, очень ручное решение. Вы можете определить размер оси, и отступы учитываются соответственно (включая условные обозначения и метки). Надеюсь, это кому-нибудь пригодится.
Пример (размер осей одинаковый!):
Код:
источник
plt.draw()
наax.figure.canvas.draw()
. Я не уверен почему, но до этого изменения размер легенды не обновлялся.fig.set_size_inches(widthTot,heightTot)
наfig.set_size_inches(widthTot,heightTot, forward=True)
.