2016-01-23 2 views
2

Когда пользователь нажимает кнопку загрузки, чтобы загрузить свой csv, мой сайт должен вернуть график matplotlib. У меня есть сюжет, сохраненный в буфере, и теперь ему просто нужно отобразить на той же странице, что и кнопка загрузки.Внедрение графика matplotlib в пределах сайта django

Я новичок в Django, так что следующее, что я сделал (предупреждение: некоторые псевдокоды вперед)

В views.py и да я могу видеть, что httprequest возвращаемый plotResult(request, csvfile_path) не взаимодействует с list.html. Я не уверен, как получить его

def list(request): 
    #Working code for uploading a csv and retrieving the path to the uploaded file 
    if document uploaded: 
     return plotResult(request, csvfile_path) 

    return render(
     request, 
     'list.html', 
     {'documents': documents, 'form': form} 
    ) 

def plotResult(request, sorted_dir): 
    # Bunch of code for computing the plot - functions in custom_script.py 
    return Plot_Composite_metrics(bunch of parameters) 

Plot_Composite_metrics находится в custom_script.py, который находится в том же каталоге, views.py и содержит множество функций для вычисления участка:

def Plot_Composite_metrics(bunch of parameters): 
    # More code for computing the plot 
    ax = plt.subplot2grid((3,4), (0,0), colspan=4) 
    # Code for adding attributes to ax. 

    # Store the now built image in a string buffer 
    buffer = StringIO.StringIO() 
    canvas = pylab.get_current_fig_manager().canvas 
    canvas.draw() 
    pilImage = PIL.Image.fromstring("RGB", canvas.get_width_height(), canvas.tostring_rgb()) 
    pilImage.save(buffer, "PNG") 
    pylab.cose() 

    return HttpResponse(buffer.getvalue(), mimetype="image/png") 

в list.html у меня есть то, что мне нужно, чтобы создать функциональные возможности загрузки, следующие для получения Matplotlib участка:

<img src="data:image/png;base64,{{graphic|safe}}"> 

Когда я запускаю это, нет сбоя, тег img сверху сначала имеет свой пустой наполнитель. Затем после загрузки веб-сайт возвращает сюжет, но на собственной странице, а не на теге img под кнопкой загрузки. Как сделать так, чтобы график matplotlib появился на одной странице?

Если случайно зная, что сюжет выглядит очень важно, здесь: here

ответ

0

Я сохранил свои графики в формате SVG для аналогичных целей,

import six 

fig = plt.figure() 
# plot some data 
tmp = six.StringIO() 
fig.savefig(tmp, format='svg', bbox_inches='tight') 

template = loader.get_template('path_to_/template.html') 
c = Context({ 'svg': tmp.getvalue() }) 
return HttpResponse(template.render(c)) 

В файле шаблона,

{% if svg %} 
<div style="width:60em;height:46em"> 
    {% autoescape off %} 
    {{ svg }} 
    {% endautoescape %} 
</div> 
Смежные вопросы