如何不本地保存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
相关产品推荐
相关产品推荐

