【问题标题】:Rendering Plotly graph onto Django application using data from SQL使用来自 SQL 的数据将 Plotly 图渲染到 Django 应用程序
【发布时间】:2020-07-13 14:59:43
【问题描述】:

我正在尝试按照此处列出的说明将 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 上调用列表函数时,数据会出现错位。 (我已经检查了网站后端的模型,数据很好-查询数据时出现问题)。

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

谢谢!

【问题讨论】:

    标签: python sql django plotly django-class-based-views


    【解决方案1】:

    我通过使用带有三个输入的 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
    

    【讨论】:

      【解决方案2】:

      也许为时已晚,但如果有人看到这个更简单的方法是使用 pandas(或者甚至不使用)

      import pandas a pd
      df = pd.DataFrame(Film.objects.values('release_date', 'gross','title'))
      ...
      def get_context_data(self, **kwargs):
              context = super(Graph, self).get_context_data(**kwargs)
      
              trace1 = go.Scatter(
                           x=df.realese_date, 
                           y=df.gross, marker={'color': 'red'}, 
                           hovertext=df.title,
                           mode="markers+text", name='1st Trace')
      
              ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-09
        • 2018-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-07
        • 1970-01-01
        • 2020-04-14
        相关资源
        最近更新 更多