web-dev-qa-db-ja.com

DjangoテンプレートにPlotlyチャートを埋め込む

Django htmlテンプレートにプロットパイチャートを埋め込みます。これは、チャートが「オンラインモード」で作成された場合(HTMLスニペットがプロットサーバーに保存されている場合) 「オフラインモード」ではありません(つまり、htmlがローカルに保存されている場合)。後者の場合、チャートは表示されません。ローカルサーバーにhtmlを保存し、そこからプロットを埋め込むことができます。

動作するビットは次のとおりです。

import plotly.plotly as py
import plotly.graph_objs as go
labels = [1,2,3,4]
values = [10,20,30,40]
ndata = 100
fig = {
    'data': [{'labels': labels,
          'values': values,
          'type': 'pie',
          'textposition':"none",
          'textinfo':"percent",
          'textfont':{'size':'12'},
          'showlegend':'false'}],
    'layout': {'title': 'Total:'+str(ndata),
           'showlegend':'false',
           'height':'200',
           'width':'200',
           'autosize':'false',
           'margin':{'t':'50','l':'75','r':'0','b':'10'},
           'separators':'.,'}
}
plotly_url = py.plot(fig, filename='myfile', auto_open=False)
pie_url = '<iframe width="200" height="200" frameborder="0" seamless="seamless" scrolling="no" src='+plotly_url+'.embed?width=200&height=200&link=false&showlegend=false></iframe>'

pie_urlは、DjangoのHttpレンダリングリクエストで文字列として渡されることに注意してください。テンプレートは、 safeタグ、つまり{{pie_url | safe}}を使用して、文字列をhtmlとして解釈します。

動作しないビットを次に示します。

from plotly.offline import download_plotlyjs, plot
import plotly.graph_objs as go
labels = [1,2,3,4]
values = [10,20,30,40]
ndata = 100
fig = {
    'data': [{'labels': labels,
          'values': values,
          'type': 'pie',
          'textposition':"none",
          'textinfo':"percent",
          'textfont':{'size':'12'},
          'showlegend':'false'}],
    'layout': {'title': 'Total:'+str(ndata),
           'showlegend':'false',
           'height':'200',
           'width':'200',
           'autosize':'false',
           'margin':{'t':'50','l':'75','r':'0','b':'10'},
           'separators':'.,'}
}
plotly_url = plot(fig, filename='file:///home/website/pie.html', auto_open=False)
pie_url = '''<iframe width="200" height="200" frameborder="0" seamless="seamless" scrolling="no" src=\"'''+plotly_url+'''.embed?width=200&height=200&link=false&showlegend=false\"></iframe>'''

アドバイスをいただければ幸いです。

19
Hooloovoo

Htmlをファイルに書き込む代わりに、グラフのhtml部分を文字列としてプロットして返すことができます。たとえば、クラスベースのTemplateViewを使用する場合:

import plotly.offline as opy
import plotly.graph_objs as go

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

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

        x = [-2,0,4,6,7]
        y = [q**2-q+3 for q in x]
        trace1 = go.Scatter(x=x, y=y, marker={'color': 'red', 'symbol': 104, 'size': "10"},
                            mode="lines",  name='1st Trace')

        data=go.Data([trace1])
        layout=go.Layout(title="Meine Daten", xaxis={'title':'x1'}, yaxis={'title':'x2'})
        figure=go.Figure(data=data,layout=layout)
        div = opy.plot(figure, auto_open=False, output_type='div')

        context['graph'] = div

        return context

およびテンプレート:

{% if graph %}
<div style="width:600;height:500">
{{ graph|safe }}
</div>
{% endif %}
35
Christian K.