python, matplotlib, svg и гиперссылки в текстовых меток

В matplotlib можно создавать цифры SVG с гиперссылками .

Например, я могу использовать метод scatter для рисования маркеров, чтобы каждый отдельный маркер был гиперссылкой.

Однако некоторые мои маркеры имеют текстовые метки, которые я создал с помощью text метода. Могу ли я каким-то образом превратить текстовые метки в гиперссылки?


До сих пор я мог добиться следующего. Во-первых, создайте текстовую метку с ограничивающей рамкой, чтобы словарь bbox имел параметр url :

 ax.text(x, y, label, bbox=dict(boxstyle=..., url=url)) 

Затем matplotlib/backends/backend_svg.py (версия 1.1.1), заменив

 self.writer.end('</a>') 

с

 self.writer.end('a') 

Сейчас это почти работает. Я могу щелкнуть по области, которая окружает текст, но не сам текст (иначе, если у меня есть черный текст на белом фоне, я могу щелкнуть в любом месте в белых частях, но не в черных частях).


Каков самый простой способ превратить всю текстовую метку в гиперссылку (как текст, так и его ограничивающий прямоугольник)?

В идеале я бы предпочел решение, которое не требует, чтобы я исправлял библиотеку matplotlib.

Это изменение в matplotlib git позволяет отображать URL-адреса текстовых объектов в качестве ссылок в визуализированном SVG.

Следующее решение работает нормально.

  • Установите атрибут gid текстового элемента в уникальную строку:

     ax.text(x, y, label, gid='foo') 
  • Создайте SVG-файл, как обычно; гиперссылок пока нет.

  • Используйте, например, lxml для разбора SVG-файла. Найдите уникальный элемент <g> с атрибутом id="foo" . Измените дерево XML: замените <g>...</g> на <a ...><g>...</g></a> . Сохраните результат.

Такой же подход, похоже, работает в целом; многие элементы принимают параметр gid .