2009-07-10 26 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 

雖然你仍然需要畫布實例化。

相關問題