Wiederkehr Matplotlib Bild als String
-
12-09-2019 - |
Frage
Ich bin mit matplotlib in einer django app und möchte direkt das gerenderte Bild zurückzukehren.
Bisher kann ich plt.savefig(...)
gehen, dann wieder die Position des Bildes.
Was ich tun möchte, ist:
return HttpResponse(plt.renderfig(...), mimetype="image/png")
Irgendwelche Ideen?
Lösung
Djangos HttpResponse
Objekt unterstützt datei wie API und Sie können eine Datei-Objekt zu savefig passieren.
response = HttpResponse(mimetype="image/png")
# create your image as usual, e.g. pylab.plot(...)
pylab.savefig(response, format="png")
return response
Damit können Sie das Bild direkt in den HttpResponse
zurück.
Andere Tipps
import pylab
import cStringIO
pylab.plot([3,7,2,1])
output = cStringIO.StringIO()
pylab.savefig('test.png', dpi=75)
pylab.savefig(output, dpi=75)
print output.getvalue() == open('test.png', 'rb').read() # True
Es ist ein Rezept in dem Matplotlib Kochbuch , das genau diese. Im Kern sieht es aus wie:
def simple(request):
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
fig=Figure()
ax=fig.add_subplot(111)
ax.plot(range(10), range(10), '-')
canvas=FigureCanvas(fig)
response=django.http.HttpResponse(content_type='image/png')
canvas.print_png(response)
return response
Setzen Sie, dass in Ihren Ansichten Datei, zeigen Sie Ihre URL, um es, und du bist weg und ausgeführt wird.
Edit: Wie bereits erwähnt, ist dies eine vereinfachte Version eines Rezept im Kochbuch. Allerdings sieht es aus wie es einen Unterschied gibt print_png
und savefig
zwischen Aufruf, zumindest im ersten Test, die ich getan habe. Der Aufruf fig.savefig(response, format='png')
gab ein Bild mit, dass größere und hatte einen weißen Hintergrund, während die ursprüngliche canvas.print_png(response)
ein etwas kleineres Bild mit einem grauen Hintergrund gab. So würde ich die letzten Zeilen ersetzt oben mit:
canvas=FigureCanvas(fig)
response=django.http.HttpResponse(content_type='image/png')
fig.savefig(response, format='png')
return response
Sie müssen noch die Leinwand instanziiert haben, though.
Beschäftigen Duck-Typing und ein Objekt der eigenen Pass, in der Verkleidung von Dateiobjekt
class MyFile(object):
def __init__(self):
self._data = ""
def write(self, data):
self._data += data
myfile = MyFile()
fig.savefig(myfile)
print myfile._data
Sie verwenden können myfile = StringIO.StringIO () statt in echtem Code und geben Daten in reponse z.
output = StringIO.StringIO()
fig.savefig(output)
contents = output.getvalue()
return HttpResponse(contents , mimetype="image/png")