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

如何不本地保存Plotly图表,直接存入变量实现单独下载?

实现Plotly图表无本地存储的单独下载

可以跳过本地保存步骤,直接在内存中处理图表数据并实现单独下载,核心思路是利用BytesIO将图表转为内存字节流,再通过Dash的dcc.send_bytes返回给用户,无需写入本地文件。

具体实现步骤

  • 导入BytesIO模块,用于在内存中暂存图表数据
  • 为每个图表创建独立的下载回调和按钮,实现单独触发下载

示例代码

from io import BytesIO
import dash
from dash import dcc, html, Input, Output, callback

# 假设你已定义好candles、indicator_chart等Plotly图表对象

app = dash.Dash(__name__)

app.layout = html.Div([
    # 每个图表对应一组下载按钮+下载组件
    dcc.Download(id='download-candles'),
    html.Button('下载K线图', id='download-candles-btn', n_clicks=0),
    
    dcc.Download(id='download-indicator1'),
    html.Button('下载指标图1', id='download-indicator1-btn', n_clicks=0),
    
    dcc.Download(id='download-indicator2'),
    html.Button('下载指标图2', id='download-indicator2-btn', n_clicks=0),
    
    dcc.Download(id='download-volume'),
    html.Button('下载成交量图', id='download-volume-btn', n_clicks=0),
])

# K线图下载回调
@callback(
    Output('download-candles', 'data'),
    Input('download-candles-btn', 'n_clicks'),
    prevent_initial_call=True
)
def download_candles_chart(n_clicks):
    buf = BytesIO()
    candles.write_image(buf, format='png')
    buf.seek(0)
    return dcc.send_bytes(buf.getvalue(), 'candles.png')

# 指标图1下载回调
@callback(
    Output('download-indicator1', 'data'),
    Input('download-indicator1-btn', 'n_clicks'),
    prevent_initial_call=True
)
def download_indicator1_chart(n_clicks):
    buf = BytesIO()
    indicator_chart.write_image(buf, format='png')
    buf.seek(0)
    return dcc.send_bytes(buf.getvalue(), 'indicator_chart.png')

# 指标图2下载回调
@callback(
    Output('download-indicator2', 'data'),
    Input('download-indicator2-btn', 'n_clicks'),
    prevent_initial_call=True
)
def download_indicator2_chart(n_clicks):
    buf = BytesIO()
    indicator_chart2.write_image(buf, format='png')
    buf.seek(0)
    return dcc.send_bytes(buf.getvalue(), 'indicator_chart2.png')

# 成交量图下载回调
@callback(
    Output('download-volume', 'data'),
    Input('download-volume-btn', 'n_clicks'),
    prevent_initial_call=True
)
def download_volume_chart(n_clicks):
    buf = BytesIO()
    volume.write_image(buf, format='png')
    buf.seek(0)
    return dcc.send_bytes(buf.getvalue(), 'volume.png')

if __name__ == '__main__':
    app.run_server(debug=True)

关键说明

  • write_image支持将图表写入BytesIO对象,直接在内存中生成图片数据,完全跳过本地文件写入步骤
  • dcc.send_bytes可直接将内存中的字节数据作为文件发送给用户,指定文件名后用户就能下载到对应格式的图片
  • 每个图表对应独立的按钮和回调,用户点击不同按钮即可单独下载目标图表,无需打包为ZIP

内容的提问来源于stack exchange,提问作者Hachqet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:12:20