Избегайте помех между несколькими фигурами Matplotlib в сети

У меня есть страница с несколькими встроенными рисунками 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("/")

С матплотлибом версии 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 проблема возвращается. Фигуры мешают друг другу, или части фигуры вообще не нарисованы? Есть идеи о том, где может быть проблема?

РЕДАКТИРОВАТЬ: Пример двух участков в одном. Линии сверху принадлежат другой фигуре, где они отсутствуют. Следует также отметить, что это никогда не является проблемой при запуске сервера разработки локально!Упс! Что-то пошло не так

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 неправильно привязывалась к экземпляру figure, что обсуждалось и решалось в этом посте.

Другие вопросы по тегам