Как отобразить несколько графиков matplotlib на одной странице шаблона django - PullRequest
1 голос
/ 03 июня 2019

Я работаю над небольшим приложением с фреймворком Django.В одном из моих шаблонов у меня есть цикл for, в котором я называю изображение сюжета matplotlib.Но Django смешивает все мои данные: некоторые графики заряжаются хорошо, другие полностью терпят крах, а некоторые смешивают данные двух графиков.Когда я беру только один график, он работает нормально, но проблема возникает случайно, когда у меня есть два или более графиков на одной странице.

Я понимаю, что проблема связана с одновременным созданием всех графиков.Matplotlib не предназначен для многопоточности Django.Итак, я ищу способ создания графиков в правильном порядке.

Создание графика в views.py

def GraphsTS(request, h):
    h = list(map(float, TS.split("-"))) # h is passed as text and transform to a list
    f = plt.figure(figsize=(5,2))
    plt.title('Title')
    plt.xlabel('Date')
    plt.ylabel('YLABEL')
    plt.xticks(rotation='vertical')
    bar1 = plt.plot(h, color='Green',alpha=0.65)

    canvas = FigureCanvasAgg(f)    
    response = HttpResponse(content_type='image/jpg')
    canvas.print_jpg(response)
    matplotlib.pyplot.close(f)
    return response

Цикл for в кластере

{% for key, h in dict.items %}
    <img src="{% url 'GraphsTS' h=h %}">
{% endif %}

Я ожидаю, что графики будут создаваться один за другим.Не имеет значения, замедляет ли это мое приложение.

1 Ответ

0 голосов
/ 05 июня 2019

Я нахожу подходящее решение самостоятельно, если кому-то здесь интересно, я использую функцию RLock().

from threading import RLock
verrou = RLock()

def GraphsTS(request, h):
    with verrou:
        h = list(map(float, TS.split("-"))) # h is passed as text and transform to a list
        f = plt.figure(figsize=(5,2))
        plt.title('Title')
        plt.xlabel('Date')
        plt.ylabel('YLABEL')
        plt.xticks(rotation='vertical')
        bar1 = plt.plot(h, color='Green',alpha=0.65)

        canvas = FigureCanvasAgg(f)    
        response = HttpResponse(content_type='image/jpg')
        canvas.print_jpg(response)
        matplotlib.pyplot.close(f)
        return response
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...