我在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