如何让PyQtGraph图表X轴显示日期格式而非时分单位?
解决PyQtGraph X轴日期格式显示问题
需求:使用PyQtGraph绘制X轴为日期的图表时,X轴当前显示小时和分钟格式,需要强制改为01.01.2024这样的日期格式。
原代码示例:
import sys import datetime import pyqtgraph as pg from PySide6.QtWidgets import QApplication, QMainWindow class MainWindow(QMainWindow): def __init__(self): super().__init__() self.plotWidget = pg.PlotWidget() self.setCentralWidget(self.plotWidget) self.scatter = pg.ScatterPlotItem() self.plotWidget.addItem(self.scatter) self.plotWidget.setBackground('w') dateAxis = pg.DateAxisItem() self.plotWidget.setAxisItems({'bottom': dateAxis}) self.add_points() def add_points(self): x_values = [datetime.date(2024, 1, 1), datetime.date( 2024, 3, 1), datetime.date(2024, 4, 21)] points = [ {'pos': (x_values[0].toordinal(), 1)}, {'pos': (x_values[1].toordinal(), 2)}, {'pos': (x_values[2].toordinal(), 3)}] self.scatter.addPoints(points) if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
解决思路
PyQtGraph的DateAxisItem默认会根据数据时间范围自动选择刻度格式,当数据间隔较大时仍显示时分是默认逻辑判断导致的。我们可以通过自定义DateAxisItem子类,重写刻度字符串生成方法,强制指定目标日期格式。
修改后的代码
import sys import datetime import pyqtgraph as pg from PySide6.QtWidgets import QApplication, QMainWindow class CustomDateAxisItem(pg.DateAxisItem): def tickStrings(self, values, scale, spacing): # 强制将所有刻度格式化为 dd.mm.yyyy return [datetime.date.fromordinal(int(v)).strftime('%d.%m.%Y') for v in values] class MainWindow(QMainWindow): def __init__(self): super().__init__() self.plotWidget = pg.PlotWidget() self.setCentralWidget(self.plotWidget) self.scatter = pg.ScatterPlotItem() self.plotWidget.addItem(self.scatter) self.plotWidget.setBackground('w') # 使用自定义的日期轴 dateAxis = CustomDateAxisItem() self.plotWidget.setAxisItems({'bottom': dateAxis}) self.add_points() def add_points(self): x_values = [datetime.date(2024, 1, 1), datetime.date( 2024, 3, 1), datetime.date(2024, 4, 21)] points = [ {'pos': (x_values[0].toordinal(), 1)}, {'pos': (x_values[1].toordinal(), 2)}, {'pos': (x_values[2].toordinal(), 3)}] self.scatter.addPoints(points) if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
关键修改说明
- 新增
CustomDateAxisItem类,继承自pg.DateAxisItem,重写tickStrings方法,直接将每个刻度值转换为dd.mm.yyyy格式的字符串 - 替换原代码中的
pg.DateAxisItem为自定义的CustomDateAxisItem,确保X轴始终显示指定格式的日期
内容的提问来源于stack exchange,提问作者Vik
相关产品推荐
相关产品推荐

