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

Discord泰国股票查询bot多次调用后matplotlib绘图叠加问题求助

股票查询机器人绘图堆叠问题修复方案

问题根因

你遇到的新旧数据堆叠问题和yfinance无关,是matplotlib的绘图缓存导致的:matplotlib默认会复用全局的活跃画布对象,第二次调用plot()方法时不会自动清空上一次绘制的内容,只会在原有图层上叠加新数据。

修复方案

修改data_visualization.py的代码,每次绘图前新建独立画布,绘制保存完成后主动清空画布资源即可:

#this is data_visualization.py 修改后的完整代码
import yfinance as yf
import pandas as pd
import datetime
from datetime import date
import numpy as np
import matplotlib.pyplot as plt
from dateutil.relativedelta import relativedelta
import os
from readable_table import print_info
from readable_table import print_table

def save_pic(pricegraph):
    pricefig = pricegraph.get_figure()
    pricefig.savefig('image1.png')
    print('Save รูป Graph ราคา')
    # 保存后关闭当前画布释放资源
    plt.close(pricefig)
    return

def get_stock_price_history_and_plot_graph(ticker, period_range, timeframe):
    # 注意:原参数名range是Python内置关键字,建议改名避免冲突,这里改为period_range
    try:
        thisday = date.today()
        # 每次绘图前新建独立画布,避免复用旧图
        plt.figure()
        # 你原代码缺少colors变量定义,这里补一个默认颜色,可自行调整
        colors = "#2ecc71"
 
        if timeframe.lower() == "y":
            start = thisday - relativedelta(years=int(period_range))
            _ticker = yf.download((ticker.lower()+'.bk'), start, thisday)
            pricegraph = _ticker['Adj Close'].plot(color=colors)
            save_pic(pricegraph)
            return
 
        elif timeframe.lower() == "m":
            start = thisday - relativedelta(months=int(period_range))
            _ticker = yf.download((ticker.lower()+'.bk'), start, thisday)
            pricegraph = _ticker['Adj Close'].plot(color=colors)
            save_pic(pricegraph)
            return
 
        elif timeframe.lower() == "d":
            start = thisday - relativedelta(days=int(period_range))
            _ticker = yf.download((ticker.lower()+'.bk'), start, thisday)
            pricegraph = _ticker['Adj Close'].plot(color=colors)
            save_pic(pricegraph)
            return
 
    except ValueError:
        print('Error Some Shit in Data data_visualization : get_stock_price_history_and_plot_graph')
        # 异常情况也要清掉空画布
        plt.close('all')
        return

你当前的bot.py中异常分支缺少await关键字,会导致错误提示无法正常发送到Discord频道,需要修改:

# bot.py 异常分支修改片段
except ValueError:
    await message.channel.send('ข้อมูลที่กรอกมามันผิดนะ')
    await message.channel.send('เจ้าหมาโง่...')

其他优化建议

  • 固定文件名image1.png在多用户同时查询时会出现文件冲突,建议用uuid生成随机临时文件名,用完即删
  • 调用yfinance下载数据后可以先判断返回的dataframe是否为空,避免空数据绘图报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:15:08