在统计图表中,使用时间作为某一坐标轴的情况非常常见,比如,常见的一年间月度销售统计,财务统计等等。在QChart中提供了日期时间坐标轴QDateTimeAxis类可以方便地将日期和时间添加到图表的坐标轴。
QDateTimeAxis类将日期和时间添加到图表的坐标轴。可以将QDateTimeAxis设置为显示带有刻度线,网格线和阴影的坐标轴样式。可以通过设置适当的DateTime格式来配置坐标轴的标签显示样式。QDateTimeAxis可以正确使用从4714 BCE到287396 CE的日期。QDateTimeAxis可以与任何QXYSeries一起使用。
使用
QDateTime.toMSecsSinceEpoch()将数据点添加到图表序列中。
- series = QLineSeries()
-
- xValue = QDateTime()
- xValue.setDate(QDate(2019, 1, 18))
- xValue.setTime(QTime(9, 34))
- yValue = 12
- series.append(xValue. toMSecsSinceEpoch(), yValue)
-
- xValue.setDate(QDate(2020, 5, 11))
- xValue.setTime(QTime(11, 14))
- yValue = 22
- series.append(xValue. toMSecsSinceEpoch(), yValue)
下面的代码说明了如何将图表序列添加到图表中,并将X轴设置为QDateTimeAxis
- chartView = QChartView()
- chartView.chart().addSeries(series)
-
- ......
- axisX = QDatetimeAxis()
- axisX.setFormat('dd-MM-yy h:mm')
- chartView.chart().setAxisX(axisX, series)
QDateTimeAxis常用函数:
QDateTimeAxis常用信号:
基于Qt提供的C++演示代码,示例图表显示了太阳黑子的数据如何随时间变化,在代码中通过使用QDateTime. toMSecsSinceEpoch方法将QDateTime对象转换成一个数添加到线型图表序列QLineSeries。完整代码如下:
- import sys,re
- from PyQt5.QtCore import Qt, QFile, QTextStream, QIODevice, QDateTime, QDate
- from PyQt5.QtGui import QPainter
- from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
- from PyQt5.QtChart import QChart, QChartView, QLineSeries, QDateTimeAxis, QValueAxis
-
- import sundata_rc
-
- class DemoDateTimeAxis(QMainWindow):
- def __init__(self, parent=None):
- super(DemoDateTimeAxis, self).__init__(parent)
-
- # 设置窗口标题
- self.setWindowTitle('实战 Qt for Python: 日期时间坐标轴演示')
- # 设置窗口大小
- self.resize(820, 540)
-
- self.createChart()
-
- def createChart(self):
-
- #设置折线数据
- lineSeries = QLineSeries()
-
- sunSpots = QFile(':sun')
- if not sunSpots.open(QIODevice.ReadOnly | QIODevice.Text):
- QMessageBox.information(self, '错误', '读取数据文件出错')
- return
-
- stream = QTextStream(sunSpots)
- while not stream.atEnd():
- line = stream.readLine()
- if line.startswith('#') or line.startswith(':'):
- continue
- #正则表达式 '\s{1,}' 匹配一个或多个空格
- values = re.split('\s{1,}', line)
- momentInTime = QDateTime()
- momentInTime.setDate(QDate(int(values[0]), int(values[1]), 15))
- lineSeries.append(momentInTime.toMSecsSinceEpoch(), float(values[2]))
- sunSpots.close()
-
- #创建图表
- chart = QChart()
- chart.legend().hide()
- chart.addSeries(lineSeries)
- chart.setTitle('太阳黑子数量(由太空天气预报中心提供)')
-
- #坐标轴
- axisX = QDateTimeAxis()
- axisX.setTickCount(10)
- axisX.setFormat('MMM yyyy')
- axisX.setTitleText('日期')
- chart.addAxis(axisX, Qt.AlignBottom)
- lineSeries.attachAxis(axisX)
-
- axisY = QValueAxis()
- axisY.setLabelFormat('%i')
- axisY.setTitleText('太阳黑子数量')
- chart.addAxis(axisY, Qt.AlignLeft)
- lineSeries.attachAxis(axisY)
-
- #图表视图
- chartView = QChartView(chart)
- chartView.setRenderHint(QPainter.Antialiasing)
-
- self.setCentralWidget(chartView)
-
-
- if __name__ == '__main__':
- app = QApplication(sys.argv)
- window = DemoDateTimeAxis()
- window.show()
- sys.exit(app.exec())

QChart日期时间坐标轴演示
请多多关注,评论,收藏,点赞,和转发。