我在django应用程序中使用matplotlib并希望直接返回呈现的图像。 到目前为止,我可以去plt.savefig(...)
,然后返回图像的位置。将Matplotlib图像作为字符串返回
我想要做的是:
return HttpResponse(plt.renderfig(...), mimetype="image/png")
任何想法?
我在django应用程序中使用matplotlib并希望直接返回呈现的图像。 到目前为止,我可以去plt.savefig(...)
,然后返回图像的位置。将Matplotlib图像作为字符串返回
我想要做的是:
return HttpResponse(plt.renderfig(...), mimetype="image/png")
任何想法?
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
中返回图像。
录用鸭子类型,并通过自己的目标,在文件对象的变相
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")
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
嗯,这可以适用于其他系统,但我认为django不会很好地处理直接打印,因为它使用HttpResponse对象进行所有对外通信。 – DarwinSurvivor 2009-07-10 22:10:07
@darwinsuvivor,同意你的观点,我只是想表明savefig到cStringIO.StringIO()对象与savefig到PNG文件是一样的。之后,这里不需要使用打印。看起来@ wierob的回答完全适合我们目前的情况。 – sunqiang 2009-07-10 22:21:47
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_png
和savefig
之间有区别。调用fig.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
虽然你仍然需要画布实例化。
这将工作得很好,但正如wierob提到的,HttpResponse已经支持文件访问(我没有意识到)。所以你可以跳过创建自己的班级。 任何人在django之外做类似的事情,这绝对是一个好主意。 – DarwinSurvivor 2009-07-10 22:14:01
实际上我并没有创建我自己的类,只是一种可能性,正如我所说的用户StringIO,并且使用respose对象本身是最好的。 – 2009-07-11 04:15:26