Подтвердить что ты не робот

Избегайте помех между несколькими рисунками 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("/")

С matplotlib версии 0.99.? Иногда я получал проблему, когда часть одной диаграммы была нарисована в другом графике на той же странице. Иногда это исправлялось после перезагрузки. Решение, с которым я столкнулся, заключалось в следующем:

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

EDIT: Пример двух графиков в одном. Линии сверху относятся к другой фигуре, где они отсутствуют. Я должен также упомянуть, что это никогда не проблема с сервером разработки локально! Oops: Something went wrong!

4b9b3361

Ответ 1

Перемещение строк импорта matplotlib с settings.py в начало каждого модуля диаграммы, а также использование savefig (как предложено jozzas - thanks), похоже, решили проблему интерференции:

Это было сделано путем удаления:

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

Затем я добавил вместо этого:

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

UPDATE: Основная проблема заключалась в том, что функция pyplot неправильно привязывалась к экземпляру фигуры, который обсуждался и решался в этом сообщении.