Python Plotly运行iplot报错 如何将图表保存为本地HTML
Plotly本地导出HTML时触发
PlotlyRequestError的绕行方案 报错原因
- 触发报错的代码行是
py.iplot(fig1, filename='table-right-aligned-plots'),该方法绑定Plotly在线服务接口,运行时需要校验本地配置的Plotly账号API密钥,且需向Plotly官方服务器发送网络请求。 - 当存在API密钥配置缺失、网络无法连通Plotly服务器的情况时,就会抛出无具体信息的
PlotlyRequestError。
核心调整思路
- 完全摒弃在线服务接口,使用Plotly内置的离线渲染能力,直接在本地生成包含全部交互逻辑的HTML文件,无需联网、无需配置账号。
具体修改步骤
- 删除冗余的在线服务导入:移除原代码开头的
import plotly.plotly as py,该导入在离线场景下无实际作用。 - 新增离线渲染接口导入:在导入区添加
from plotly.offline import plot。 - 替换触发报错的调用行:将原有的
py.iplot(fig1, filename='table-right-aligned-plots')替换为plot(fig1, filename='table-right-aligned-plots.html', auto_open=False)。- 可选参数说明:
auto_open=False用于设置生成HTML后不自动唤起浏览器,避免打断脚本运行流程。
- 可选参数说明:
最终实现效果
- 生成的HTML文件存储在脚本运行的本地路径下,打开后可直接查看交互式看板:左半区为比特币交易明细表格,右半区垂直排布3个挖矿指标折线图,完全匹配参考的180天比特币挖矿统计展示效果。
修正后的完整可运行代码
import plotly.graph_objs as go from plotly.offline import plot import numpy as np import pandas as pd # 运行前需提前加载包含对应字段的df数据集 table_trace1 = go.Table( domain=dict(x=[0, 0.5], y=[0, 1.0]), columnwidth = [30] + [33, 35, 33], columnorder=[0, 1, 2, 3, 4], header = dict(height = 50, values = [['<b>Date</b>'],['<b>Number<br>transactions</b>'], ['<b>Output<br>volume(BTC)</b>'], ['<b>Market<br>Price</b>']], line = dict(color='rgb(50, 50, 50)'), align = ['left'] * 5, font = dict(color=['rgb(45, 45, 45)'] * 5, size=14), fill = dict(color='#d562be')), cells = dict(values = [df[k].tolist() for k in ['Date', 'Number-transactions', 'Output-volume(BTC)', 'Market-price']], line = dict(color='#506784'), align = ['left'] * 5, font = dict(color=['rgb(40, 40, 40)'] * 5, size=12), format = [None] + [", .2f"] * 2 + [',.4f'], prefix = [None] * 2 + ['$', u'\u20BF'], suffix=[None] * 4, height = 27, fill = dict(color=['rgb(235, 193, 238)', 'rgba(228, 222, 249, 0.65)'])) ) trace1=go.Scatter( x=df['Date'], y=df['Hash-rate'], xaxis='x1', yaxis='y1', mode='lines', line=dict(width=2, color='#9748a1'), name='hash-rate-TH/s' ) trace2=go.Scatter( x=df['Date'], y=df['Mining-revenue-USD'], xaxis='x2', yaxis='y2', mode='lines', line=dict(width=2, color='#b04553'), name='mining revenue' ) trace3=go.Scatter( x=df['Date'], y=df['Transaction-fees-BTC'], xaxis='x3', yaxis='y3', mode='lines', line=dict(width=2, color='#af7bbd'), name='transact-fee' ) axis=dict( showline=True, zeroline=False, showgrid=True, mirror=True, ticklen=4, gridcolor='#ffffff', tickfont=dict(size=10) ) layout1 = dict( width=950, height=800, autosize=False, title='Bitcoin mining stats for 180 days', margin = dict(t=100), showlegend=False, xaxis1=dict(axis, **dict(domain=[0.55, 1], anchor='y1', showticklabels=False)), xaxis2=dict(axis, **dict(domain=[0.55, 1], anchor='y2', showticklabels=False)), xaxis3=dict(axis, **dict(domain=[0.55, 1], anchor='y3')), yaxis1=dict(axis, **dict(domain=[0.66, 1.0], anchor='x1', hoverformat='.2f')), yaxis2=dict(axis, **dict(domain=[0.3 + 0.03, 0.63], anchor='x2', tickprefix='$', hoverformat='.2f')), yaxis3=dict(axis, **dict(domain=[0.0, 0.3], anchor='x3', tickprefix=u'\u20BF', hoverformat='.2f')), plot_bgcolor='rgba(228, 222, 249, 0.65)' ) fig1 = dict(data=[table_trace1, trace1, trace2, trace3], layout=layout1) plot(fig1, filename="table-right-aligned-plots.html", auto_open=False)
注意:运行前需确保加载的数据集包含
Date、Number-transactions、Output-volume(BTC)、Market-price、Hash-rate、Mining-revenue-USD、Transaction-fees-BTC全部字段,否则会触发字段不存在的报错。
内容的提问来源于stack exchange,提问作者user9185511
相关产品推荐
相关产品推荐

