如何在PyQtGraph中设置%d.%m.%Y格式的文本日期轴
PyQtGraph 底部轴显示自定义日期格式解决方案
问题说明
现有PyQtGraph图表底部轴显示时间戳数值,需要替换为%d.%m.%Y格式的字符串日期,现有代码中尝试用DateAxisItem未达到预期效果。
实现步骤
- 自定义继承自
pg.AxisItem的轴类,重写tickStrings方法,将时间戳转换为目标格式的日期字符串。 - 将自定义轴设置为PlotWidget的底部轴。
- 确保X轴传入的是时间戳数值(PyQtGraph轴底层仍处理数值,仅修改显示的标签文本)。
修改后的完整代码
import pyqtgraph as pg from datetime import datetime, timedelta import pandas as pd import ccxt # 自定义日期轴类 class CustomDateAxis(pg.AxisItem): def tickStrings(self, values, scale, spacing): # 将时间戳转换为datetime对象,再格式化为'%d.%m.%Y' return [datetime.fromtimestamp(v).strftime('%d.%m.%Y') for v in values] # 原类中的相关代码修改 # ...(其他原有代码保留) self.graph = pg.PlotWidget(self) self.graph.setBackground("w") self.graph.showGrid(x=True, y=True) pen = pg.mkPen(color=(90, 169, 240), width=5) self.graph.setYRange(0, 1000) self.plot = self.graph.plot( [], [], pen=pen, symbol='o', symbolSize=4, symbolBrush="b", ) self.widgets.append(self.graph) def optimize_view(self): self.graph.setGeometry(6, 0, self.width(), self.height() - 50) def setup_graph(self, sym): if sym != 'USDT': try: data = self.get_price_history(self.parent().valute, self.time_frame) except: self.plot.setData([], []) return # 捕获异常后直接返回,避免后续报错 else: data = [] if not data: self.plot.setData([], []) return new_date = datetime.now() - timedelta(len(data) - 1) # 生成时间戳序列,确保和数据长度匹配 res = pd.date_range(new_date, datetime.now(), periods=len(data)).tolist() res = [datetime.timestamp(i) for i in res] self.graph.setYRange(min(data), max(data)) self.graph.setXRange(min(res), max(res)) # 使用自定义日期轴替换底部轴 date_axis = CustomDateAxis(orientation='bottom') self.graph.setAxisItems({'bottom': date_axis}) self.plot.setData(res, data) def get_price_history(self, symbol, timeframe): exchange = ccxt.binance() data = exchange.fetch_ohlcv(f'{symbol}/USDT', timeframe) prices = [candle[3] for candle in data] return prices
关键修改点
- 自定义轴类:
CustomDateAxis重写tickStrings方法,把每个刻度对应的时间戳直接转换成%d.%m.%Y格式的字符串。 - 修复数据长度匹配问题:原代码中
pd.date_range生成的日期序列长度可能和data不匹配,改用periods=len(data)确保一一对应。 - 异常处理优化:捕获异常后直接返回,避免后续代码因
data为空报错。
内容的提问来源于stack exchange,提问作者Icold
相关产品推荐
相关产品推荐

