He buscado mucho sobre este tema, pero no soy desarrollador web, así que sé que me faltan algunos conceptos.
Cuando ejecuto matplotlib localmente y especifico el backend 'webagg', ejecutar plt.show() inicia un servidor web liviano y abre el gráfico en mi navegador con funcionalidad interactiva completa.
import matplotlib as mpl mpl.use('webagg') from matplotlib import pyplot as plt import numpy as np f,ax = plt.subplots(1) ydata = np.random.randint(0,100,100) xdata = np.linspace(1,100,100) ax.plot(xdata,ydata,picker=5) ax.set_title('Click the line to change the color') def onpick(event): event.artist.set_color('red') f.canvas.draw_idle() f.canvas.mpl_connect('pick_event', onpick) plt.show()Mi pregunta es: ¿es posible usar el backend de webagg con mi sitio web de django para servir figuras de matplotlib interactivas ordenadas a los usuarios? En otras palabras, ¿puedo usar el código anterior en algún lugar de mi sitio de Django para que la trama se incruste en una página web?
(Conozco herramientas como mpld3, que son geniales, pero no recrean completamente la funcionalidad del widget/selector en matplotlib).
Hay un ejemplo de cómo incrustar las figuras interactivas usando web_agg y Tornado . Lo cambié con éxito para usar Flask, pero sigo usando los sockets web de Tornado. Primero pruebe a ejecutar el siguiente ejemplo y vea si la interactividad es 'suficientemente buena' para usted. Cuando lo ejecuté, la respuesta no es muy rápida (lea la última parte si desea obtener más información al respecto).
Básicamente, para implementarlo en una página web, usa un websocket para enviar/recibir mensajes para la parte interactiva y para enviar la trama como datos binarios si tiene que volver a dibujarse.
Siguiendo el ejemplo, es bastante sencillo usarlo con diferentes marcos/servidores (consulte el enlace anterior para obtener más detalles):
Es bueno revisar las cosas de webagg github (webagg_core, webagg, mpl.js, tal vez también nb_agg). Sé que esta no es una respuesta completa, pero espero que le brinde alguna dirección sobre lo que debe hacer.
Un poco fuera de tema sobre el comentario en el primer párrafo:
Desafortunadamente, soy nuevo en el desarrollo web para determinar si la respuesta es un límite de cómo se implementa web_agg en el ejemplo, o si depende de cómo está configurado su servidor/backend/threading. Por lo que puedo ver, el backend nb_agg del cuaderno jupyter también usa parte del backend web_agg y parece funcionar mucho más receptivo en el cuaderno. Pero probablemente debería hacer una pregunta separada para discutir estos temas.