2017-04-11 2 views
0

J'ai beaucoup cherché sur ce sujet mais je ne suis pas un développeur web donc je sais que certains concepts me manquent. Lorsque j'exécute matplotlib localement et que je spécifie le backend 'webagg', lancer plt.show() démarre un serveur web léger et ouvre le tracé dans mon navigateur avec une fonctionnalité interactive complète.Le backend 'webagg' pour matplotlib peut-il fonctionner avec mon site django?

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() 

Ma question est: Est-il possible d'utiliser le backend webagg avec mon site django pour servir de chiffres matplotlib interactifs nettes aux utilisateurs? En d'autres termes, puis-je utiliser le code ci-dessus quelque part dans mon site django de sorte que l'intrigue sera intégrée dans une page Web?

(Je connais des outils comme mpld3, qui sont très cool, mais ne recréent pas complètement la fonctionnalité widget/sélecteur dans matplotlib).

Répondre

0

Il existe un exemple d'intégration des figures interactives à l'aide du web_agg and Tornado. J'ai réussi à l'utiliser avec Flask, mais en utilisant toujours les sockets web Tornado. Essayez d'exécuter l'exemple ci-dessous en premier et voyez si l'interactivité est «assez bonne» pour vous. Quand je l'ai couru, la réponse n'est pas vraiment super accrocheuse (lisez la dernière partie si vous voulez un peu plus d'infos à ce sujet). Fondamentalement, pour l'implémenter sur une page Web, vous utilisez une socket Web pour envoyer/recevoir des messages pour la partie interactive, et pour envoyer le tracé en tant que données binaires si elle doit être redessinée.

Suivant l'exemple, il est tout à fait tout droit à utiliser avec différents cadres/serveurs (vérifier le lien ci-dessus pour plus de détails):

  • créer votre silhouette comme d'habitude.
  • créer un gestionnaire pour votre personnage avec backend webagg
  • servent les mpl.js
  • implémentent un objet websocket, il a besoin des fonctions send_json et send_binary (ceux-ci sont appelés à partir du code python webagg lorsque vous ajoutez le websocket à la gestionnaire)
  • dans le modèle que vous servez du côté client. Utilisez javascript pour créer un websocket et créer un chiffre en utilisant mpl.js.

Il est bon de regarder à travers le webagg github stuff (webagg_core, webagg, mpl.js, peut-être aussi nb_agg). Je sais que ce n'est pas une réponse complète, mais j'espère que cela vous donne une direction sur ce que vous devez faire.

Bit hors-sujet sur le commentaire dans le premier paragraphe:

Malheureusement, je suis nouveau sur le développement web afin de déterminer si la réponse est une limite de la façon dont l'web_agg est mis en œuvre dans l'exemple, ou si elle dépend de la configuration de votre serveur/backend/threading. De ce que je peux voir le backend nb_agg ordinateur portable jupyter utilise également une partie du backend web_agg et semble fonctionner beaucoup plus réactif dans le cahier. Mais je devrais probablement faire une question distincte discuter de ces questions.