Как вывести график из Matplotlib в шаблонах Django?

#python #django #graph #django-templates #matplotlib

#python #django #График #django-шаблоны #matplotlib

Вопрос:

Учитывая этот пример, взятый из здесь:

 def simple(request):
    import random

    from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
    from matplotlib.figure import Figure
    from matplotlib.dates import DateFormatter

    fig=Figure()
    ax=fig.add_subplot(111)
    x=[]
    y=[]
    now=datetime.datetime.now()
    delta=datetime.timedelta(days=1)
    for i in range(10):
        x.append(now)
        now =delta
        y.append(random.randint(0, 1000))
    ax.plot_date(x, y, '-')
    ax.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d'))
    fig.autofmt_xdate()
    canvas=FigureCanvas(fig)
    response=django.http.HttpResponse(content_type='image/png')
    canvas.print_png(response)
    return response
  

Как я могу написать представление таким образом, чтобы использовать шаблон и переменную типа:
return render_to_response ('template.html',{'graph': <graph generated by matplotlib> }

Ответ №1:

Когда у меня была похожая ситуация, я использовал два представления. Один использовал matplotilb для генерации PNG, в то время как другой использовал шаблоны django для создания HTML-страницы, которая представляла PNG (и некоторые другие данные). Параметром, отправленным в шаблон, было просто имя файла PNG. Затем другой вид прикрепляется к соответствующим URL-адресам в формате png.

Одна из проблем заключается в том, что вы хотите вычислить некоторые параметры, которые используются как для генерации HTML, так и PNG. Я закодировал такую информацию в имени файла. Это болезненно и немного халтурно, но для пользователя также полезно, если вся информация содержится в имени файла, когда он его сохраняет.

Комментарии:

1. Я не предполагаю, что вы знаете о другой библиотеке / пакете, который будет это делать? Действительно хотите избежать написания 2 представлений для каждого типа графика.

2. Итак, вам приходилось записывать каждый график в таблицу и вызывать его снова?

3. Я думал, что иметь два представления было естественным, поскольку задействованы два URL-адреса. Один для PNG-файла и один для HTML-страницы-оболочки. Возможно, вы хотите отображать только PNG-файл без страницы переноса, но в этом случае я вообще не понимаю, как в него попадают шаблоны django.