我试图在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渲染请求中作为字符串传递。模板使用 | 安全标记将字符串解释为html,即{{pie_url | safe}}。
以下是不起作用的一点:
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>'''
任何建议都将受到赞赏。
答案 0 :(得分:33)
不是将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 %}
答案 1 :(得分:9)
plotly有一些更新,其中一些适用于 plotly 4 + :
注意:使用plotly.py不需要互联网连接,帐户或付款。在版本4之前,此库可以在“在线”或“离线”模式下运行。该文档倾向于强调在线模式,在该模式下,图形将发布到Chart Studio Web服务。在版本4中,所有“在线”功能已从plotly软件包中删除,现在可以作为单独的可选chart-studio软件包使用(请参见下文)。 plotly.py版本4仅为“离线”,并且不包含任何将图形或数据上传到云服务的功能。
to_html
功能这允许您执行以下操作以嵌入图离线:
graph = fig.to_html(full_html=False, default_height=500, default_width=700)
context = {'graph': graph}
response = render(request, 'graph.html', context)
在graph.html
中,您可以执行以下操作:
{% if graph %}
{{ graph|safe }}
{% else %}
<p>No graph was provided.</p>
{% endif %}
答案 2 :(得分:0)
让我们假设您的代码绘制了图形,即
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>'''
是一个名为graph_function()
的功能。在那个里面,只需替换
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>'''
使用
plt_div = plotly.offline.plot(fig, output_type='div')
return plt_div
然后在您的views.py:
def graph_view(request):
my_graph=graph_function()
context={'graph':my_graph}
return render(request, 'my_template.html', context_dict)
,然后在您的模板中:
{% if graph %}
{{ graph|safe }}
{% else %}
<p>No graph was provided.</p>
{% endif %}