Возврат Matplotlib отображает как строка

При использовании Линейного Хеширования сама таблица автоматически заботится об изменении размеров путем поддержания постоянного коэффициента загрузки.

8
задан Donald Duck 4 September 2017 в 11:38
поделиться

4 ответа

Объект Django HttpResponse поддерживает файловый API, и вы можете передать файл-объект в savefig.

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

Следовательно, вы можете вернуть изображение непосредственно в ] HttpResponse .

17
ответ дан 5 December 2019 в 06:38
поделиться

There is a recipe in the Matplotlib Cookbook that does exactly this. At its core, it looks like:

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

Put that in your views file, point your URL to it, and you're off and running.

Edit: As noted, this is a simplified version of a recipe in the cookbook. However, it looks like there is a difference between calling print_png and savefig, at least in the initial test that I did. Calling fig.savefig(response, format='png') gave an image with that was larger and had a white background, while the original canvas.print_png(response) gave a slightly smaller image with a grey background. So, I would replace the last few lines above with:

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

You still need to have the canvas instantiated, though.

2
ответ дан 5 December 2019 в 06:38
поделиться

а как насчет 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
6
ответ дан 5 December 2019 в 06:38
поделиться

Использовать ducktyping и передать собственный объект, замаскировав файловый объект

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

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

, вы можете использовать myfile = StringIO.StringIO () вместо этого в реальном коде и возвращать данные в ответе, например,

output = StringIO.StringIO()
fig.savefig(output)
contents = output.getvalue()
return HttpResponse(contents , mimetype="image/png")
0
ответ дан 5 December 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: