2014-01-09 4 views
1

Я пытаюсь получить и установить положение перетаскиваемой легенды в matplotlib. Мое приложение состоит из интерактивного графического интерфейса, который имеет функцию перерисовки/построения графика, которая должна выполнять следующие этапы:Как я могу установить положение перетаскиваемой легенды в matplotlib

  1. сохранить положение текущей легенды.
  2. очистить текущие оси и выполнить различные операции построения графика, которые могут или могут добавлять метки к их графикам.
  3. построить новую перетаскиваемую легенду (ax.legend().draggable()) и восстановить старую позицию легенды.

В промежутке между этими шагами пользователь может перетащить легенду, и цель состоит в том, чтобы сохранить положение легенды при перерисовании сюжетов.

Мой первый подход состоял в том, чтобы использовать oldpos = legend.get_bbox_to_anchor() и legend.set_bbox_to_anchor(oldpos) в шагах 1 и 3. Однако это приводит к тому, что легенда полностью перемещается с видимой области.

Обратите внимание, что я должен использовать ax.legend() и не может использовать fig.legend(lines, labels), так как шаг 2 полностью разъединены, то есть, я ничего не знаю о линий и меток на шаге 3. знать Согласно ответам на вопрос How to position and align a matplotlib figure legend?, как представляется, разница между этими двумя возможностями относительно координат осей или фигур. Очевидно, что моя проблема вызывает координаты фигур, но я не совсем понял, как преобразовать bbox в «bbox в координатах фигур».

Еще более серьезная проблема, которую я только осознал, заключается в том, что, видимо, legend.get_bbox_to_anchor() всегда возвращает одинаковые значения независимо от положения перетаскивания. Так может быть, якорь может быть (ab-) использован для управления позицией статических легенд? Есть ли другой/правильный способ сохранить и восстановить положение перетаскиваемой легенды?

ответ

1

Изучив реализацию Legend, я обнаружил, что есть недокументированное свойство _loc, которое точно делает то, что я хочу. Мое решение выглядит удивительно просто:

oldLegPos = ax.get_legend()._loc 

# perform all plotting operations... 

legend = ax.legend().draggable() 
legend._loc = oldLegPos 

Похоже _loc автоматически сохраняет рисунок координаты, так как я не нужно преобразовать координаты в любом случае (например, когда черчения операции полностью изменить оси диапазонов/координат.) ,

Смежные вопросы