Сюжет matplotlib в Сети - PullRequest
       7

Сюжет matplotlib в Сети

10 голосов
/ 01 апреля 2011

Следующий код, конечно, создаст PNG с именем test и сохранит его на сервере:

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.Есть ли способ рисовать PNG и выводить на странице Python, которая создает изображение?Спасибо!

Ответы [ 2 ]

21 голосов
/ 01 апреля 2011

Сначала вам потребуется страница для загрузки URL-адреса из контроллера веб-сервера, который генерирует изображение:

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

Затем вставьте код 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)

Примечание: вы можете добавить кеширование для них, есличасто генерируются с одними и теми же аргументами, например, строят ключ из аргументов и записывают данные изображения в memcache, затем проверяют memcache перед восстановлением графика.

2 голосов
/ 11 ноября 2018

Просто обновить для 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...