首页 > 解决方案 > 使用来自 SQL 的数据将 Plotly 图渲染到 Django 应用程序

问题描述

我正在尝试按照此处列出的说明将 Plotly 散点图集成到我的 Django 应用程序中:Embedding a Plotly chart in a Django template

我想在 Plotly 图上呈现的数据来自应用程序的 SQL 数据库,但我不知道如何在不从数据集中删除值的情况下查询数据。

下面是views.py文件:

release_dates = list(models.Film.objects.values_list('release_date', flat=True).distinct())
gross = list(models.Film.objects.values_list('gross', flat=True).distinct())
title = list(models.Film.objects.values_list('title', flat=True).distinct())

class Graph(TemplateView):
    template_name = 'graph.html'
    
    def get_context_data(self, **kwargs):
        context = super(Graph, self).get_context_data(**kwargs)

        trace1 = go.Scatter(x=release_dates, y=gross, marker={'color': 'red'}, hovertext = title,
                            mode="markers+text",  name='1st Trace')
        data=go.Data([trace1])
        layout=go.Layout(title="Films by Gross", xaxis= {'title':'Year'}, yaxis={'title':'Gross'})
        figure=go.Figure(data=data,layout=layout)
        div = opy.plot(figure, auto_open=False, output_type='div')

        context['graph'] = div

        return context

问题是,当 Plotly Graph 在网页上呈现时,数据会变得混乱,以至于电影的标题与它们的发行日期和总票房不匹配。

我认为问题在于数据库中存在缺失值或“空”值,因此当我在“release_date”、“gross”和“title”values_list 上调用列表函数时,数据会错位。(我已经检查了网站后端的模型,数据很好 - 查询数据时出现问题)。

有没有比使用我上面所做的列表函数更好的方法来呈现这些数据,或者有更好的方法一起解决这个问题。

谢谢!

标签: pythonsqldjangoplotlydjango-class-based-views

解决方案


我通过使用具有三个输入的函数查询数据库来解决这个问题Model.object.values_list- 它在列表中返回了我想要的 x 和 y 坐标和 hovertext 值,然后我可以循环遍历:

import plotly.offline as opy
import plotly.graph_objs as go
from home.models import Film

model_data = Film.objects.values_list('release_date', 'gross','title')
x_value_list = []
y_value_list = []
z_value_list = []
for values in model_data:
    x_value_list.append(values[0])
    y_value_list.append(values[1])
    z_value_list.append(values[2])

class Graph(TemplateView):
    template_name = 'graph.html'

    def get_context_data(self, **kwargs):
        context = super(Graph, self).get_context_data(**kwargs)

        trace1 = go.Scatter(x=x_value_list, y=y_value_list, marker={'color': 'red'}, hovertext = z_value_list,
                            mode="markers+text", name='1st Trace')
        data=go.Data([trace1])
        layout=go.Layout(title="Films by Gross", xaxis= {'title':'Year'}, yaxis={'title':'Gross'})
        figure=go.Figure(data=data,layout=layout)
        div = opy.plot(figure, auto_open=False, output_type='div')

        context['graph'] = div

        return context

推荐阅读