2016-04-25 26 views
10

Próbuję osadzić spiskowy wykres kołowy w szablonie html Django. Działa to dobrze, gdy wykres jest tworzony w "trybie online" (tzn. Fragment HTML jest przechowywany na silnym serwerze), ale nie w trybie offline (to znaczy, gdy html jest przechowywany lokalnie). W tym ostatnim przypadku wykres nie pojawia się. Chcę móc przechowywać html na moim lokalnym serwerze i osadzać tam wątki.Osadzanie wykresu Plotly w szablonie Django

Oto nieco, że działa:

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>' 

Zauważ, że pie_url jest przekazywana jako ciąg znaków w polu http czynią wniosek w Django. Szablon interpretuje ciąg jako html przy użyciu | bezpieczny tag, czyli {{pie_url | safe}}.

Oto nieco, że nie działa:

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>''' 

Wszelkie porady będą mile widziane.

+1

jesteś w stanie wyprowadzać go do pliku .html? – frankenapps

+0

Cześć, Tak, plik HTML zostaje utworzony. Ale nie wyświetla się, gdy Django go renderuje (jest to linia pie_url w oryginalnym wpisie). – Hooloovoo

Odpowiedz

20

Zamiast pisać html do pliku, możesz spleść zwracać część html wykresu jako ciąg znaków. Na przykład, przy użyciu TemplateView klasy w oparciu o:

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 

i szablonu:

{% if graph %} 
<div style="width:600;height:500"> 
{{ graph|safe }} 
</div> 
{% endif %} 
+1

Możesz prawdopodobnie umieścić to w swoich widokach, aby renderować ten kontekst. 'g = Graph()' 'context = g.get_context_data() '' 'renderowanie zwrotu (żądanie, 'app/stats.html', kontekst)' EDYCJA: używaj TemplateViews bezpośrednio w adresach URL https://docs.djangoproject.com/en/1.10/ref/class-based- views/base/# templateview – Naman