2012-09-12 28 views
5

En matplotlib, es posible create SVG figures with hyperlinks.python, matplotlib, svg e hipervínculos en etiquetas de texto

Por ejemplo, puedo usar el método scatter para dibujar marcadores para que cada marcador individual sea un hipervínculo.

Sin embargo, algunos de mis marcadores tienen etiquetas de texto que he creado con el método text. ¿Puedo de alguna manera convertir las etiquetas de texto en hipervínculos también?


Hasta ahora he podido lograr lo siguiente. En primer lugar, crear una etiqueta de texto con un cuadro delimitador de modo que el diccionario bbox tiene un parámetro de url:

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

Entonces parchear matplotlib/backends/backend_svg.py (versión 1.1.1) ligeramente, en sustitución de

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

con

self.writer.end('a') 

Ahora es casi funciona. Puedo hacer clic en el área que rodea el texto, pero no el texto en sí (de lo contrario, si tengo texto negro sobre fondo blanco, puedo hacer clic en cualquier parte de las partes blancas, pero no en las partes negras).


¿Cuál es la forma más fácil de convertir toda la etiqueta de texto en un hipervínculo (tanto el texto como su cuadro delimitador)?

Idealmente, preferiría una solución que no requiera que aplique parches a la biblioteca matplotlib.

+0

Parece que ha encontrado un error. ¿Te importa informarlo en el rastreador de problemas github.com/matplotlib/matplotlib? Si estás ansioso, esto también haría una primera contribución bastante capaz. ;-) HTH – pelson

+0

@pelson: Bueno, la parte '' es, por supuesto, un error, y sin duda sería genial si alguien lo solucionó.Sin embargo, el problema principal es que faltan algunas características, y no sé si alguna vez se implementarán estas características en Matplotlib. Realmente no puedo esperar a eso, y por lo tanto estaba buscando algunos trucos que podría usar en mi propio código. Ya estoy haciendo cosas como postprocesar el código SVG que fue producido por Matplotlib, así que no me importa si los trucos son feos. :) –

Respuesta

0

La siguiente solución parece funcionar bien.

  • Establecer el atributo gid del elemento de texto a una cadena única:

    ax.text(x, y, label, gid='foo') 
    
  • Crear el archivo SVG como de costumbre; no hay hipervínculos todavía

  • Utilice, por ejemplo, lxml para analizar el archivo SVG. Busque el elemento único <g> con el atributo id="foo". Modifique el árbol XML: reemplace <g>...</g> con <a ...><g>...</g></a>. Guarde el resultado.

El mismo enfoque parece funcionar en general; muchos elementos aceptan un parámetro gid.

1

This change en matplotlib git permite renderizar Campos de URL del objeto de texto como enlaces en el SVG representado.

+0

Esto es muy bueno IMO. A partir de 1.3.1, simplemente usar 'set_url()' para un artista parece funcionar para todo excepto para el texto real. El pequeño parche de mtd corrige eso (se ha fusionado, por lo que uno podría simplemente actualizar matplotlib). – travc

+0

Uno probablemente también quiere que el fondo del texto sea un enlace. Para 1.3.1, se puede hacer fácilmente con algo como: 'txt = text (x, y, 'something', url = 'something')' 'txt.set_bbox (dict (color = 'w', alpha = 0.01) , url = txt.get_url()) ' El color y alfa es un poco hackish ... al menos la versión 1.3.1 no parece crear el cuadro si el color es nulo o alfa es 0. – travc

Cuestiones relacionadas