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

これは動作するように見える他にもいくつかの提案がありますが、これは私が使いやすいもののように見えます。私は約2行か3行のコードを追加するだけです! ありがとうございます – DarwinSurvivor

0

採用のダック・タイピングおよびファイルオブジェクトの変装

class MyFile(object): 
    def __init__(self): 
     self._data = "" 
    def write(self, data): 
     self._data += data 

myfile = MyFile() 
fig.savefig(myfile) 
print myfile._data 

にあなたが実際のコードに代わり= StringIO.StringIO()myfileを使用することができますし、例えばREPONSEにデータを返す、あなた自身のオブジェクトを渡します

output = StringIO.StringIO() 
fig.savefig(output) 
contents = output.getvalue() 
return HttpResponse(contents , mimetype="image/png") 
+0

これはかなりうまくいくはずですが、wierobで述べたように、HttpResponseはすでにファイルアクセスをサポートしています(これは私が気づいていない)。だからあなたは自分のクラスを作ることをスキップすることができます。 誰かがdjangoの外で同様のことをやっている人は、これは間違いなく良いアイデアのように見えます。 – DarwinSurvivor

+0

私は実際に私は自分のクラスを作成していない、それはただの可能性でした。私はユーザーStringIOと言っていました。 –

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

+0

@darwinsuvivor、私はちょうどcStringIO.StringIO()オブジェクトにsavefigがPNGファイルへのsavefigと同じであることを示したいと思います。その後、ここでプリントを使う必要はありません。 @ wierobの答えは現在の状況に完全に適合しているようです。 – sunqiang

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 

あなたはまだしかし、キャンバスをインスタンス化する必要があります。

+0

canvase.print_pngを使用しているときと、単にHttpResponseでsave_fig()を実行しているときの違い(速度、効率など)はありますか? – DarwinSurvivor

+0

スピードの違いを測定する必要がありますが、編集で指摘されているようにプレゼンテーションに違いがあります。これはpylab/pyplotラッパー関数にも依存しません。これは私がこのようなアプリケーションに好きです。 –

関連する問題