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?

War es hilfreich?

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

cStringIO ?

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")
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top