matplotlib 如何使用flask将mplfinance蜡烛图发送到前端?

31moq8wy  于 2023-10-24  发布在  其他
关注(0)|答案(2)|浏览(141)

我正在做flask项目,我使用mplfinance库来创建蜡烛图,我需要将此图表传递到前端。

@app.route('/chartdata', methods =['POST'])
def chart_data():
    if request.method == 'POST':
        
        body = request.json
        df = pd.read_csv('test_data.csv',index_col=0,parse_dates=True)
        df.index.name = 'Date'
        mplfinance.plot(df, type = 'candle',style ='yahoo',savefig ="sample.png")
        
        return "image to transferred"

我尝试了这种保存图像并将其传递到前面的方法,但在这里我无法避免图表绘图打开,有没有人知道更好的方法将这些图表转移到这个 flask 项目的前端HTML页面

lnlaulya

lnlaulya1#

我相信这个问题已经解决了,但在这里为子孙后代。
重要的部分是设置后端使用非gui方法。同时确保使用send_file处理发回缓冲区和文件名。对于普通matplotlib,这些策略相同,只需将文件名替换为io.BytesIO,它就会自动处理它。似乎python的趋势是让它接受文件名,或某种流接口。
这应该是一个粗略的近似值。

# Use buffer to save object
from io import BytesIO

# Set the matplotlib to a no display backend
import matplotlib
matplotlib.use('agg')

import mplfinance

@app.route('/chartdata', methods =['POST'])
def chart_data():
    if request.method == 'POST':
        body = request.json
        df = pd.read_csv('test_data.csv',index_col=0,parse_dates=True)
        df.index.name = 'Date'

        # The buffer the figure will save to instead of a filename.
        memory_file = BytesIO()
        mplfinance.plot(df, type = 'candle',style ='yahoo',savefig=dict(fname=memory_file, format="png"))

        # seek to the beginning to the buffer because send_file will start at the current io position. 
        memory_file.seek(0)

        # send the file back to the user as an attachment 
        # so it will prompt to download.
        return send_file(memory_file, download_name="sample.png", as_attachment=True)
eyh26e7m

eyh26e7m2#

您可以将图形保存到io.BytesIO对象并将其发送到前端,如这里的https://mellowd.dev/python/using-io-bytesio/
mplfinance.plot(...)有一个savefig参数,请参阅https://github.com/matplotlib/mplfinance/blob/master/src/mplfinance/plotting.py#L171
像下面这样的东西,需要测试,因为mplfinance.plot()没有图像格式的关键字。

import io

@app.route('/chartdata', methods =['POST'])
def chart_data():
    if request.method == 'POST':
        
        body = request.json
        df = pd.read_csv('test_data.csv',index_col=0,parse_dates=True)
        df.index.name = 'Date'
        b = io.BytesIO()
        mplfinance.plot(df, type = 'candle',style ='yahoo', savefig=b)
        return b

相关问题