当用户单击“上传”按钮上传其csv时,我的网站应返回matplotlib图。我已将绘图保存到缓冲区,现在只需将其显示在与上载按钮相同的页面中。

我是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图嵌入在同一页面上?

如果有可能知道情节的样子很重要,请在这里:python - 在Django网站中嵌入matplotlib图-LMLPHP

最佳答案

我已将地块以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>

关于python - 在Django网站中嵌入matplotlib图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34958702/

10-10 15:13