私は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
にあなたが実際のコードに代わり= StringIO.StringIO()myfileを使用することができますし、例えばREPONSEにデータを返す、あなた自身のオブジェクトを渡します
output = StringIO.StringIO()
fig.savefig(output)
contents = output.getvalue()
return HttpResponse(contents , mimetype="image/png")
これはかなりうまくいくはずですが、wierobで述べたように、HttpResponseはすでにファイルアクセスをサポートしています(これは私が気づいていない)。だからあなたは自分のクラスを作ることをスキップすることができます。 誰かがdjangoの外で同様のことをやっている人は、これは間違いなく良いアイデアのように見えます。 – DarwinSurvivor
私は実際に私は自分のクラスを作成していない、それはただの可能性でした。私はユーザーStringIOと言っていました。 –
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
@darwinsuvivor、私はちょうどcStringIO.StringIO()オブジェクトにsavefigがPNGファイルへのsavefigと同じであることを示したいと思います。その後、ここでプリントを使う必要はありません。 @ wierobの答えは現在の状況に完全に適合しているようです。 – sunqiang
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
あなたはまだしかし、キャンバスをインスタンス化する必要があります。
canvase.print_pngを使用しているときと、単にHttpResponseでsave_fig()を実行しているときの違い(速度、効率など)はありますか? – DarwinSurvivor
スピードの違いを測定する必要がありますが、編集で指摘されているようにプレゼンテーションに違いがあります。これはpylab/pyplotラッパー関数にも依存しません。これは私がこのようなアプリケーションに好きです。 –
これは動作するように見える他にもいくつかの提案がありますが、これは私が使いやすいもののように見えます。私は約2行か3行のコードを追加するだけです! ありがとうございます – DarwinSurvivor