Python读取CSV文件OHLC数据绘制K线图显示异常如何解决?
问题根因
你的代码核心问题是K线宽度参数不符合数据的时间粒度,另外存在可优化的依赖库选择问题:
- 宽度单位不匹配:
candlestick_ohlc的width参数单位为天,你的数据是1小时粒度的行情,1小时仅等于1/24≈0.04天,你原先设置的width=0.6相当于14.4小时的宽度,会导致相邻K线完全重叠,就是你截图里看到的异常显示效果。 - 依赖库过时:你使用的
mpl_finance已经官方停止维护,后续可能出现兼容性问题,更推荐使用官方新维护的mplfinance库绘制K线。
修正方案
方案1:不更换依赖库,仅调整参数
只需要修改candlestick_ohlc的width参数,同时可以补充X轴刻度定位规则,让时间显示更合理:
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from mpl_finance import candlestick_ohlc import matplotlib.dates as mpl_dates import matplotlib.pyplot as plt import pandas as pd import tkinter as Tk if __name__ == '__main__': root = Tk.Tk() root.title("candle") root.geometry('600x550') file = 'Code.csv' data = pd.read_csv(file) ohlc = data.loc[:, ['Date', 'Open', 'High', 'Low', 'Close']] ohlc['Date'] = pd.to_datetime(ohlc['Date']) ohlc['Date'] = ohlc['Date'].apply(mpl_dates.date2num) ohlc = ohlc.astype(float) # Creating Subplots fig = plt.Figure(figsize=(6, 5), dpi=100) ax = fig.add_subplot(111) # 仅修改这里的width参数即可,0.035对应约50分钟宽度,留出少量间隙 candlestick_ohlc(ax, ohlc.values, width=0.035, colorup='green', colordown='red', alpha=0.8) # Setting labels & titles ax.set_xlabel('Date') ax.set_ylabel('Price') fig.suptitle('Hourly Candlestick Chart ') # Formatting Date date_format = mpl_dates.DateFormatter('%d-%m-%Y %H:%M') ax.xaxis.set_major_formatter(date_format) # 新增:设置X轴每1小时显示一个刻度 ax.xaxis.set_major_locator(mpl_dates.HourLocator(interval=1)) fig.autofmt_xdate() fig.tight_layout() canvas = FigureCanvasTkAgg(fig, master=root) canvas.get_tk_widget().pack() root.mainloop()
方案2:更换为官方推荐的mplfinance库(更稳定)
首先安装依赖:pip install mplfinance
修正后代码如下:
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg import mplfinance as mpf import pandas as pd import tkinter as Tk if __name__ == '__main__': root = Tk.Tk() root.title("candle") root.geometry('600x550') file = 'Code.csv' data = pd.read_csv(file, index_col=0, parse_dates=True) data.index.name = 'Date' # 直接生成K线图的Figure对象 fig, _ = mpf.plot(data, type='candle', style='yahoo', title='Hourly Candlestick Chart', ylabel='Price', figratio=(6,5), returnfig=True) canvas = FigureCanvasTkAgg(fig, master=root) canvas.get_tk_widget().pack() root.mainloop()
内容的提问来源于stack exchange,提问作者Misha Pakhomov
相关产品推荐
相关产品推荐

