在网上绘制matplotlib

Jas*_*pel 10 python matplotlib

以下代码当然会创建一个名为test的PNG并将其保存在服务器上:

from matplotlib.figure import Figure                         
from matplotlib.backends.backend_agg import FigureCanvasAgg  

fig = Figure(figsize=[4,4])                                  
ax = fig.add_axes([.1,.1,.8,.8])                             
ax.scatter([1,2], [3,4])                                     
canvas = FigureCanvasAgg(fig)                                
canvas.print_figure("test.png")
Run Code Online (Sandbox Code Playgroud)

然后要在浏览器中查看图像,我们必须转到example.com/test.png.这意味着我们必须首先使用Python代码调用页面来创建test.png文件,然后转到PNG文件.有没有办法从创建图像的Python页面绘制PNG和输出?谢谢!

sam*_*ias 21

首先,您需要一个页面来从生成图像的Web服务器控制器加载URL:

<img src="/matplot/makegraph?arg1=foo" />
Run Code Online (Sandbox Code Playgroud)

然后,将matplotlib代码嵌入到makegraph控制器中.您只需要在内存缓冲区中捕获画布渲染的PNG,然后创建HTTP响应并将字节写回浏览器:

import cStringIO
from matplotlib.figure import Figure                      
from matplotlib.backends.backend_agg import FigureCanvasAgg

fig = Figure(figsize=[4,4])                               
ax = fig.add_axes([.1,.1,.8,.8])                          
ax.scatter([1,2], [3,4])                                  
canvas = FigureCanvasAgg(fig)

# write image data to a string buffer and get the PNG image bytes
buf = cStringIO.StringIO()
canvas.print_png(buf)
data = buf.getvalue()

# pseudo-code for generating the http response from your
# webserver, and writing the bytes back to the browser.
# replace this with corresponding code for your web framework
headers = {
    'Content-Type': 'image/png',
    'Content-Length': len(data)
    }
response.write(200, 'OK', headers, data)
Run Code Online (Sandbox Code Playgroud)

注意:如果它们经常使用相同的参数生成,您可能希望为这些添加缓存,例如,从args构造一个键并将图像数据写入memcache,然后在重新生成图形之前检查memcache.

  • 看来你也可以做plt.savefig(buf,format ="png",facecolor ="white")或fig.savefig().所以你不必处理canvas对象. (3认同)

小智 5

只是为了更新python3

StringIO 和 cStringIO 模块消失了。相反,导入 io 模块并使用 io.StringIO https://docs.python.org/3.5/whatsnew/3.0.html?highlight=cstringio

所以现在应该是这样的:

import io
from matplotlib.figure import Figure     
from matplotlib import pyplot as plt                 

fig = Figure(figsize=[4,4])                               
ax = fig.add_axes([.1,.1,.8,.8])                          
ax.scatter([1,2], [3,4])                                  

buf = io.BytesIO()
fig.savefig(buf, format='png')
plt.close(fig)
data=buf.getvalue()

# In my case I would have used Django for the webpage
response = HttpResponse(data, content_type='image/png')
return response
Run Code Online (Sandbox Code Playgroud)