10
votes

Renvoyer une image matplotlib en tant que chaîne

J'utilise Matplotlib dans une application Django et souhaitez renvoyer directement l'image rendue. Jusqu'à présent, je peux aller plt.savefig (...) code>, puis renvoyer l'emplacement de l'image.

Ce que je veux faire est: p>

return HttpResponse(plt.renderfig(...), mimetype="image/png")


0 commentaires

4 Réponses :


0
votes

Employer du duchagetyping et transmettez un objet à votre origine, dans le déguisement de l'objet de fichier xxx

Vous pouvez utiliser myFile = stringio.stringio () au lieu du code réel et renvoyer des données en réponse, par exemple < / p> xxx


2 commentaires

Cela fonctionnerait assez bien, mais comme WIEROB mentionné, HTTPRESPonse prend déjà en charge l'accès au dossier (que je n'ai pas réalisé). Donc, vous pouvez ignorer la création de votre propre classe. Quiconque fait quelque chose de similaire à l'extérieur de Django, cela ressemble vraiment à une bonne idée.


En fait, je ne crée pas ma propre classe qui n'était qu'une possibilité, comme je l'ai dit User Stringidio, et oui avec l'objet de réponse lui-même est le meilleur.



6
votes

Quoi de Cstringio ? XXX


2 commentaires

Hmm, cela fonctionnerait pour d'autres systèmes, mais je ne pense pas que Django gérerait très bien l'impression directe car elle utilise des objets HTTPResponse pour toute sa communication sortante.


@darwinSuvivor, d'accord avec vous, je veux juste montrer que Saviserfig sur un objet cstringio.stringio () est identique à celui de Saviserfig vers le fichier PNG. Après cela, il n'est pas nécessaire d'utiliser Imprimer ici. Il semble que la réponse de Wierob est complétée à notre situation actuelle.



18
votes

HTTPResponse Object prend en charge l'API de type Fichier et vous pouvez transmettre un objet-fichier à Savisterfig. XXX

Par conséquent, vous pouvez renvoyer l'image directement dans le httpresponse .


1 commentaires

Il y a quelques autres suggestions qui semblent fonctionner, mais cela ressemble vraiment à la tâche la plus facile à utiliser. Je n'ai qu'à ajouter environ 2 ou 3 lignes de code! Merci



2
votes

Il y a une recette dans le Cookbook MATPLOTLIB qui fait exactement cela. À son noyau, on dirait:

    canvas=FigureCanvas(fig)
    response=django.http.HttpResponse(content_type='image/png')
    fig.savefig(response, format='png')
    return response


2 commentaires

Y a-t-il une différence (vitesse, efficacité, etc.) entre l'utilisation de canvase.print_png et simplement de faire une sauvegarde_fig () sur le HTTPResponse?


Vous devrez mesurer la différence de vitesse, mais il y a une différence de présentation comme indiqué dans la modification. Cela ne dépend également pas des fonctions d'emballage PYLAB / PYPLOT, que j'aime pour ce type d'application.