You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 19:24:02