如何在Django视图中生成直方图(来自Pandas DF)并传递给模板?

时间:2017-12-03 18:01:37

标签: python django dataframe plot

我有一个在Django中调用以下视图函数时执行的脚本:

def CalScriptResultsView(request):
    all_activities = models.CalEvents.objects.filter(user=request.user)

    activities = ['Undefined',]
    for activity in all_activities:
        activities.append(activity.activity_code)

    script_result = gCalScriptMain.main(activities)

    return render(request, 'gCalData/gCalData_result.html', {'script_result': script_result})

脚本gCalScriptMain.main()读取Google日历中的事件并构建Pandas数据框。数据框的标题(列)是用户定义的活动,索引(行)由日期类型日期组成(例如2017-10-02)。实际数据包括每天每项活动花费的小时数(在三个月内)。

我希望能够绘制一个如下所示的直方图: Desired histogram type

我必须以某种方式将直方图返回到视图,然后将其传递到相应的模板并显示在网页上。

我尝试的是以下内容:

import matplotlib.pyplot as plt

df.hist()
plt.savefig('path/to/hist.png')

但它只是生成一个空白文件。

然而,我也怀疑这是一种好方法还是有更好的方法。有任何想法吗?

1 个答案:

答案 0 :(得分:0)

我发现pygal是我想要完成的好工具。我正在创建.svg文件并从模板中调用它。

line_chart = pygal.Line()
line_chart.title = 'Hours spent in each activity during the specified 
period ({} to {})'.format(input_start,input_end)
line_chart.x_labels = map(lambda d: d.strftime('%Y-%m-%d'), 
list(df.index.values))
for activity in act_hours:
    line_chart.add(activity, df[activity])

static_path = 'images/charts/line_chart_{}.svg'.format(user.id)
line_chart.render_to_file('static/' + static_path)

activities['static_path'] = static_path

在模板中:

  <div class="container">
    {% with chart_path=script_result.static_path %}
    <object type="image/svg+xml" data="{% static chart_path %}">
      Error: Your browser doesn't support SVG files
    </object>
    {% endwith %}
  </div>