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
相关产品推荐
相关产品推荐

