Python 在Web上打印matplotlib

Python 在Web上打印matplotlib,python,matplotlib,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,.

下面的代码当然会创建一个名为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")

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

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

<img src="/matplot/makegraph?arg1=foo" />

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

仅更新python3

StringIO和cStringIO模块不见了。而是导入io 模块和使用io.StringIO

所以现在应该是这样的:

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

看起来您还可以执行plt.savefig(buf,format=“png”,facecolor=“white”)或fig.savefig()。因此,您不必处理画布对象,您可能已经知道这一点,但如果您希望使用交互式图表而不是静态图像,则可以使用mpld3()。
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