避免网络上多个Matplotlib数字之间的干扰

时间:2011-10-06 11:12:04

标签: django matplotlib

我有一个嵌入了多个Matplotlib数字的页面。这些数字通过Ajax插入/操作如下(带有时间戳以便浏览器重新加载):

<img src="/charts/somedata.png?time=' + str(time.time()) + '" />

然后将网址匹配到一个视图(我应该提到我使用Django):

(r'^charts/(?P<chart>[A-Za-z_]+).png$', 'views.charts'),

def charts(request, chart):
    # Dynamically loading the appropriate module
    chart_module = import_module('functions.charts.' + chart)
    return chart_module.show_chart(request)

图表模块(somedata.py)如下所示:

from __future__ import division
from django.http import HttpResponseRedirect, HttpResponse

def show_chart(request):
    try:
        # Initiating figure
        from matplotlib.pyplot import figure
        from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
        fig1 = figure(figsize=(5.33,4), facecolor = 'white')
        ax = fig1.add_axes([0.02,0.02,0.98,0.98], aspect='equal')

        # Some plotting to ax

        canvas=FigureCanvas(fig1)
        response=HttpResponse(content_type='image/png')
        canvas.print_png(response)
        fig1.clear()
        return response

    except:
        return HttpResponseRedirect("/")

使用matplotlib版本0.99。?我有时遇到的问题是,在同一页面上的另一个图表中绘制了一个图表的一部分。有时,重新加载后修复了这个问题。我想出的解决方案是将以下内容放在settings.py中:

# Force matplotlib to NOT use any Xwindows backend.
# This is necessary before importing pyplot or anything else from matplotlib
import matplotlib
matplotlib.use('Agg')

但是,在更新到matplotlib版本1.0.1后,问题又回来了。这些数字相互干扰,或者根本没有绘制图形的某些部分?关于问题可能在哪里的任何想法?

编辑:两个地块的示例合二为一。顶部的线条属于另一个图形,缺少它们。我还要提一下,这绝不是本地运行开发服务器的问题! Oops: Something went wrong!

1 个答案:

答案 0 :(得分:1)

将settings.py中的matplotlib导入行移动到每个图表模块的顶部以及使用savefig(由jozzas提出 - 感谢)似乎已经解决了干扰问题:

这是通过删除:

完成的
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
canvas=FigureCanvas(fig1)
canvas.print_png(response)

然后我添加了:

fig1.savefig(response, format='png')

<强>更新 主要问题是pyplot函数没有正确附加到图形实例,这在this post中进行了讨论和解决。