Избегайте помех между несколькими фигурами Matplotlib в сети - PullRequest
3 голосов
/ 06 октября 2011

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

Однако после обновления до версии 1.0.1 matplotlib проблема возвращается.Фигуры мешают друг другу, или части фигуры вообще не нарисованы?Любые идеи о том, где может быть проблема?

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

1 Ответ

1 голос
/ 03 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...