10

我在 django 应用程序中使用 matplotlib,并希望直接返回渲染图像。到目前为止我可以去plt.savefig(...),然后返回图像的位置。

我想做的是:

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

有任何想法吗?

4

4 回答 4

18

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.

于 2009-07-10T13:13:05.970 回答
6

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
于 2009-07-10T11:12:49.490 回答
2

Matplotlib Cookbook中有一个食谱可以做到这一点。在其核心,它看起来像:

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

把它放在你的视图文件中,将你的 URL 指向它,然后你就可以开始运行了。

编辑:如前所述,这是食谱中食谱的简化版本。但是,至少在我所做的初始测试中,调用print_pngand之间似乎存在差异。savefigCallingfig.savefig(response, format='png')给出了一个更大的图像,并且具有白色背景,而原始图像则canvas.print_png(response)给出了一个略小的图像,具有灰色背景。因此,我将上面的最后几行替换为:

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

不过,您仍然需要实例化画布。

于 2009-07-10T21:56:05.290 回答
0

使用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")
于 2009-07-10T11:01:13.960 回答