2012-01-24 9 views
11

Mi objetivo es hacer un gráfico con el que pueda interactuar en el navegador. Idealmente, me gustaría una biblioteca de trazado de JavaScript bien documentada y madura que admita SVG. Por lo que puedo decir, esto no existe, aunque por favor corrígeme si me equivoco.Quiero hacer un gráfico SVG estático (desde matplotlib) interactivo a través del navegador

He identificado un par de alternativas.

  1. utilizar una biblioteca de gráficos JavaScript (por ejemplo Rafael) y dibuja todo desde cero. Esto parece mucho trabajo innecesario y tedioso.
  2. Utilice una biblioteca de trazado para producir SVG, luego use JavaScript para admitir la interacción. Esto parece más manejable, aunque tengo el siguiente problema: ¿Cómo puedo agregar metadatos al SVG desde la biblioteca de trazado (matplotlib)? Estos metadatos no se mostrarán cuando se muestre el SVG, pero se podría acceder desde JavaScript.

Cualquier consejo es muy apreciado.

+4

Sólo un pensamiento: Si lo hace 'hold (true); plot ([1,2,3,4], gid = 'foo'); plot ([4,3,2,1], gid = 'bar'); savefig ('foobar.svg') ', el archivo resultante tendrá los elementos' 'y' 'rodeando las dos líneas, lo que imagino que usted podría usar desde Javascript para manipular los objetos. –

+0

Hmm, sí, esta podría ser una forma de agregar metadatos específicos de curva. Sin embargo, estoy buscando una forma de agregar metadatos para cada punto en una curva, esencialmente un valor 'z' oculto. Si no puedo encontrar otra solución, creo que podría lanzar una gran cadena JSON en el 'id' con todos los metadatos que necesito. – David

Respuesta

0

Si su objetivo es tomar la salida de un svg estático generado mediante alguna herramienta de trazado, y convirtiéndola en algo interactivo, entonces probablemente tendrá que llegar a algo usted mismo ya que la salida probablemente será diferente para cada herramienta.

Sin embargo, hay un montón de bibliotecas de gráficos SVG interactivos por ahí, algunos ejemplos:

11

Uno camino a esto se puede ver en el matplotlib gallery.

Básicamente:

  1. En matplotlib, utilice element.set_gid ("youridhere") en el elemento matplotlib desea realizar interactiva. Es decir, use set_gid() en la salida de plot()/hist()/whatever().
  2. Cree un svg con matplotlib, pero use un objeto StringIO como su archivo.
  3. analizar el SVG con una biblioteca de XML (por ejemplo xml.etree.ElementTree)
  4. Encontrar los elementos XML con el identificador que se establece (por ejemplo, "youridhere").
  5. Agregue onclick/on $ {theeventyoucareabout} atributos con un nombre de función de JavaScript.
  6. Agregue un elemento de script con su javascript como un CDATA al árbol xml.
  7. Exportar el xml a un archivo svg!
+0

esto presumiblemente introducirá una gran cantidad de retrasos .. grandes retrasos y bloqueos del navegador, junto con una gran utilización de recursos desde el punto de vista del servidor. – khan

+3

Sí. No estaba sugiriendo hacer esto sobre la marcha. La pregunta era generar un SVG interactivo. Esto generará un SVG que se puede alojar como un archivo estático sin ningún problema. –

Cuestiones relacionadas