2009-07-10 20 views
7

我在django应用程序中使用matplotlib并希望直接返回呈现的图像。 到目前为止,我可以去plt.savefig(...),然后返回图像的位置。将Matplotlib图像作为字符串返回

我想要做的是:

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

任何想法?

回答

16

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中返回图像。

0

录用鸭子类型,并通过自己的目标,在文件对象的变相

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

这将工作得很好,但正如wierob提到的,HttpResponse已经支持文件访问(我没有意识到)。所以你可以跳过创建自己的班级。 任何人在django之外做类似的事情,这绝对是一个好主意。 – DarwinSurvivor 2009-07-10 22:14:01

+0

实际上我并没有创建我自己的类,只是一种可能性,正如我所说的用户StringIO,并且使用respose对象本身是最好的。 – 2009-07-11 04:15:26

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 
+0

嗯,这可以适用于其他系统,但我认为django不会很好地处理直接打印,因为它使用HttpResponse对象进行所有对外通信。 – DarwinSurvivor 2009-07-10 22:10:07

+0

@darwinsuvivor,同意你的观点,我只是想表明savefig到cStringIO.StringIO()对象与savefig到PNG文件是一样的。之后,这里不需要使用打印。看起来@ wierob的回答完全适合我们目前的情况。 – sunqiang 2009-07-10 22:21:47

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_pngsavefig之间有区别。调用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 

虽然你仍然需要画布实例化。

相关问题