【问题标题】:Avoid interference between multiple Matplotlib figures on the web避免网络上多个 Matplotlib 图之间的干扰
【发布时间】:2011-12-02 04:09:32
【问题描述】:

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

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

然后将 url 匹配到类似的视图(我应该提到我使用 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 版本后,问题又回来了。图形相互干扰,或者图形的某些部分根本没有绘制?关于问题可能出在哪里的任何想法?

编辑:两个图合二为一的示例。顶部的线条属于另一个图形,它们在那里缺失。我还应该提到,这绝不是在本地运行开发服务器的问题!

【问题讨论】:

  • 你能给我们展示一个带有两个绘图的示例 png 吗?
  • @jozzas 请看我上面的编辑:这很烦人,但经常在重新加载后得到解决。任何想法可能取决于什么?
  • 我会将您的 matplotlib 导入行移动到文件顶部,作为开始。另请查看使用 savefig 而不是 print_png。 savefig 仅适用于图形,而 pring_png 适用于您的画布,看起来它正在被回收且未正确清除。

标签: django matplotlib


【解决方案1】:

将 matplotlib 导入行从 settings.py 移动到每个图表模块的顶部以及使用 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中讨论并解决。

【讨论】:

    猜你喜欢
    • 2021-04-29
    • 1970-01-01
    • 2013-10-07
    • 2020-04-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多