Domanda

Sto usando matplotlib in un app Django e vorrei tornare direttamente l'immagine renderizzata. Finora posso andare plt.savefig(...), per poi tornare alla posizione dell'immagine.

Quello che voglio fare è:

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

Tutte le idee?

È stato utile?

Soluzione

oggetto HttpResponse di Django supporta API simile a file e si può passare un file-oggetto per savefig.

response = HttpResponse(mimetype="image/png")
# create your image as usual, e.g. pylab.plot(...)
pylab.savefig(response, format="png")
return response

Quindi, è possibile restituire l'immagine direttamente nel HttpResponse.

Altri suggerimenti

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

C'è una ricetta nel Matplotlib Cookbook che fa esattamente questo. Al suo centro, il suo aspetto:

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

Metti che nel file di vista, puntare l'URL ad esso, e sei fuori e in esecuzione.

Edit: Come notato, questa è una versione semplificata di una ricetta nel libro di cucina. Tuttavia, sembra che ci sia una differenza tra chiamare print_png e savefig, almeno nel test iniziale che ho fatto. Chiamata fig.savefig(response, format='png') ha dato un'immagine con che era più grande e aveva uno sfondo bianco, mentre il canvas.print_png(response) originale ha dato un'immagine leggermente più piccolo con uno sfondo grigio. Quindi, vorrei sostituire le ultime righe di cui sopra con:

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

È ancora bisogno di avere la tela istanziato, però.

Impiegare duck typing e passare un oggetto del proprio, sotto mentite spoglie di oggetto file

class MyFile(object):
    def __init__(self):
        self._data = ""
    def write(self, data):
        self._data += data

myfile = MyFile()
fig.savefig(myfile)
print myfile._data

è possibile utilizzare myfile = StringIO.StringIO () invece nel codice reale e restituire i dati in reponse es.

output = StringIO.StringIO()
fig.savefig(output)
contents = output.getvalue()
return HttpResponse(contents , mimetype="image/png")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top