图表的坐标轴
要正确显示数据序列所表示的图表,需要给数据序列关联坐标轴,根据数据序列的类型关联对应类型的坐标轴。
图表的坐标轴类型和继承关系如图 所示,坐标轴的类型有:
- QValueAxis
- QLogValueAxis
- QBarCategoryAxis
- QCategoryAxis
- QDataTimeAxis
它们都是从QAbstractAxis 继承而来的.
QAbstractAxis
QAbstractAxis是抽象类,不能直接使用,需要用其子类定义坐标轴。
QAbstractAxis方法
QAbstractAxis定义子类的公共属性和信号,其常用方法如表所示。
QAbstractAxis的方法及参数类型 | 说 明 |
---|---|
show()、hide() | 显示坐标轴、隐藏坐标轴 |
setVisible(visible: bool=True) | 设置坐标轴是否可见 |
isVisible() | 获取坐标轴是否可见 |
setMin(Any)、setMax(Any)、setRange(Any.Any) | 设置坐标轴的最小和最大值 |
setReverse(reverse:bool=True) | 设置坐标轴的方向颠倒 |
isReverse() | 获取是否颠倒 |
setTitleText(str) | 设置坐标轴标题的名称 |
setTitleVisible(visible=True) | 设置坐标轴标题的可见性 |
isTitleVisible() | 获取标题是否可见 |
setTitleBrush(brush: Union[QBrush,Qt.BrushStyle,Qt.GlobalColor,QColor,QGradient,QImage,QPixmap])… | 设置标题的画刷 |
setTitleFont(font:Union[QFont,str,Sequence[str]]) | 设置标题的字体 |
setGridLineColor(color:Union[QColor,QL.GlobalColor.str]) | 设置主网格线的颜色 |
setGridLinePen(pen: Union[QPen,Qt.PenStyle.QColor]) | 设置主网格线的钢笔 |
setGridLineVisible(visible:bool=True) | 设置主网格线是否可见 |
isGridLineVisible() | 获取主网格线是否可见 |
setMinorGridlLineColor(color:Union[QColor,Qt.GlobalColor,str]) | 设置次网格线的颜色 |
setMinorGridLinePen(QPen) | 设置次网格线的颜色 |
setMinorGridLineVisible(visible:bool=True) | 设置次网格线是否可见 |
isMinorGridLineVisible() | 获取次网格线是否可见 |
setLabelsAngle(int) | 设置刻度标签的旋转角度 |
setLabelsBrush(Union[QBrush,QColor,Qt.GlobalColor,QGradient]) | 设置刻度标签的画刷 |
setLabelsColor(color:Union[QColor,Qt.GlobalColor,strJ) | 设置刻度标签的颜色 |
setLabelsEditable(editable;bool=True) | 设置标签是否可编辑 |
setLabelsFont(font;Union[QFont,str,Sequence[str]]) | 设置标签的字体 |
setLabelsVisible(visible;bool=True) | 设置标签是否可见 |
setTruncateLabels(truncateLabels:bool=True) | 当无法全部显示标签时,设置是否可 截断显示 |
setLinePen(pen:Union[QPen,Qt.PenStyle,QColor]) | 设置坐标轴的线条的钢笔 |
setLinePenColor(color:Union[QColor,Qt.GlobalColor,str]) | 设置坐标轴的线条的钢笔颜色 |
setLineVisible(visible:bool=True) | 设置坐标轴的线条是否可见 |
isLineVisible() | 获取坐标轴的线条是否可见 |
setShadesBorderColor(color: Union[QColor,Qt.GlobalColor,str]) | 设置阴影边框的颜色 |
setShadesBrush(Union[QBrush,QColor,Qt.GlobalColor,QGradient]) | 设置阴影的画刷 |
setShadesColor(color:Union[QColor,Qt.GlobalColor,str]) | 设置阴影的颜色 |
setShadesPen(pen:Union[QPen,Qt.PenStyle,QColor]) | 设置阴影的钢笔 |
setShadesVisible(visible:bool=True) | 设置阴影是否可见 |
alignment() | 获取对齐方式 Qt.Alignment |
QAbstractAxis 的信号
QAbstractAxis 的信号如表所示通过名称可知其表达的含义和信号发送的时机。
QAbstractAxis的信号 | 参数 | 说明 |
---|---|---|
colorChanged(color) | color – PySide6.QtGui.QColor | 当轴的颜色变为颜色时,会发出此信号。 |
gridLineColorChanged(color) | color – PySide6.QtGui.QColor | 当用于绘制网格线的笔的颜色变为颜色时,会发出此信号。 |
gridLinePenChanged(pen) | pen – PySide6.QtGui.QPen | 当用于绘制网格线的笔变为笔时,会发出此信号。 |
gridVisibleChanged(visible) | visible – bool | 当轴的网格线的可见性更改为可见时,会发出此信号。 |
labelsAngleChanged(angle) | angle – int | 当轴标签的角度更改为角度时,会发出此信号。 |
labelsBrushChanged(brush) | brush – PySide6.QtGui.QBrush | 当用于绘制轴标签的画笔更改为画笔时,会发出此信号。 |
labelsColorChanged(color) | color – PySide6.QtGui.QColor | 当轴标签的颜色更改为颜色时,会发出此信号。 |
labelsEditableChanged(editable) | editable – bool | 当标签的可编辑状态发生变化时,会发出此信号。 |
labelsFontChanged(pen) | pen – PySide6.QtGui.QFont | 当轴标签的字体更改为字体时,会发出此信号。 |
labelsTruncatedChanged(labelsTruncated) | labelsTruncated – bool | 该信号在两种情况下发出; 当轴从具有一个或多个截断标签改变为没有截断标签时 以及当轴从没有截断标签改变成具有一个或者多个截断的标签时。当前状态由标签Truncated标识。 |
labelsVisibleChanged(visible) | visible – bool | 当轴标签的可见性更改为可见时,会发出此信号。 |
linePenChanged(pen) | pen – PySide6.QtGui.QPen | 当用于绘制轴线的笔变为笔时,会发出此信号。 |
lineVisibleChanged(visible) | visible – bool | 当轴线的可见性更改为可见时,会发出此信号。 |
minorGridLineColorChanged(color) | color – PySide6.QtGui.QColor | 当用于绘制次要网格线的笔的颜色变为颜色时,会发出此信号。 |
minorGridLinePenChanged(pen) | pen – PySide6.QtGui.QPen | 当用于绘制次要网格线的笔变为笔时,会发出此信号。 |
minorGridVisibleChanged(visible) | visible – bool | 当轴的次网格线的可见性更改为可见时,会发出此信号。 |
reverseChanged(reverse) | reverse – bool | 当颠倒轴改变状态是发送此信号 |
shadesBorderColorChanged(color) | color – PySide6.QtGui.QColor | 当轴的边框颜色变为颜色时,会发出此信号。 |
shadesBrushChanged(brush) | brush – PySide6.QtGui.QBrush | 当用于绘制轴阴影的笔刷更改为笔刷时,会发出此信号。 |
shadesColorChanged(color) | color – PySide6.QtGui.QColor | 当轴的颜色变为颜色时,会发出此信号。 |
shadesPenChanged(pen) | pen – PySide6.QtGui.QPen | 当用于绘制轴阴影的笔更改为笔时,会发出此信号。 |
shadesVisibleChanged(visible) | visible – bool | 当轴阴影的可见性更改为可见时,会发出此信号。 |
titleBrushChanged(brush) | brush – PySide6.QtGui.QBrush | 当用于绘制轴标题的画笔更改为画笔时,会发出此信号。 |
titleFontChanged(font) | font – PySide6.QtGui.QFont | 当轴标题的字体更改为字体时,会发出此信号。 |
titleTextChanged(title) | title – str | 当轴标题的文本更改为文本时,会发出此信号。 |
titleVisibleChanged(visible) | visible – bool | 当轴的标题文本的可见性更改为可见时,会发出此信号。 |
truncateLabelsChanged(truncateLabels) | truncateLabels – bool | 当标签的截断变为truncateLabels时,会发出此信号。 |
visibleChanged(visible) | visible – bool | 当轴的可见性更改为可见时,会发出此信号。 |
QValueAxis
数值轴QValueAxis 适用于具有连续数据坐标的图表,它在继承 QAbstractAxis 的属性、方法和信号的同时,根据数值轴的特点又增添了一些设置坐标轴刻度的方法。
用QValueAxis 创建实例对象的方法是
from PySide6.QtCharts import QValueAxis
QValueAxis(parent: Union[PySide6.QtCore.QObject,NoneType]= None)-> None
数值轴的常用方法
数值轴QValueAxis的常用方法如表所示主要方法介绍如下。
- 用setTickAnchor(float)方法设置刻度错点(参考点);
- 用setTickInterval(float)方法设置刻度之间的间隔值;
- 用setTickCount(int)方法设置刻度数量,刻度线平均分布在最小值和最大值之间;
- 用setTickType(type:QValueAxis.TickType)方法设置刻度类型,参数可取:
- QValueAxis.TicksDynamic
- QValueAxis.TicksFixed.
- 用setLabelFormat(str)方法设置刻度标签的格式符可以使用字符串的"%“格式符,例如”%3d"表示输出3 位整数,"%7.2"表示输出宽度为7位的浮点数,其中小数位为2,整数位为 4,小数点占1位,
- 用applyNiceNumbers()智能方法设置刻度的标签。
QValueAxis的方法及参数类型 | 说 明 |
---|---|
setTickCount(int) | 设置刻度线的数量 |
setTickAnchor(float) | 设置刻度锚点 |
setTickInterval(float) | 设置刻度线的间隔值 |
setMinorTickCount(int) | 设置次刻度的数量 |
setTickType(type: QValueAxis.TickType) | 设置刻度类型 |
setMax(float) | 设置最大值 |
setMin(float) | 设置最小值 |
setRange(float,float) | 设置坐标轴的最小值和最大值 |
setLabelFormat(str) | 设置标签的格式 |
[slot]applyNiceNumbers() | 使用智能方法设置刻度的标签 |
数值轴QValueAxis的信号
信号 | 参数 | 说明 |
---|---|---|
labelFormatChanged(format) | format – str | 当轴标签的格式更改时,会发出此信号。 |
maxChanged(max) | max – float | 当轴的最大值(由max指定)发生变化时,会发出此信号。 |
minChanged(min) | min – float | 当轴的最小值(由min指定)发生变化时,会发出此信号。 |
minorTickCountChanged(tickCount) | tickCount – int | 当minorTickCount指定的轴上的次要刻度线数量发生变化时,会发出此信号。 |
rangeChanged(min,max) | min – float max – float | 当轴的最小值或最大值(由最小值和最大值指定)发生变化时,会发出此信号。 |
tickAnchorChanged(anchor) | anchor – float | 刻度线布局发生变化时,会发出此信号。 |
tickCountChanged(tickCount) | tickCount – int | 当tickCount指定的轴上的刻度线数量发生变化时,会发出此信号。 |
tickIntervalChanged(interval) | interval – float | 刻度线数发生变化时,会发出此信号。 |
tickTypeChanged(type) | type – TickType | 刻度发生变化时,会发出此信号。 |
QLogValueAxis
对数轴 QLogValueAxis 是一个非线性值变化坐标轴它是基于数量级的非线性标尺轴上的每一个刻度线都是由前一个刻度线的值乘以一个固定的值而得到的。
from PySide6.QtCharts import QLogValueAxis
QLogValueAxis(parent: Union[PySide6.QtCore.QObject,NoneType]= None)-> None
如果QLogValueAxis 连接的数据序列中含有 0或负数,则该数据序列不会被绘制。
QLogValueAxis 的方法不多,主要是:
- 用setBase(float)方法设置对数的基;
- 用setLabelFormat(str)方法设置标签格式;
- 用setMin(float)方法、setMax(float)方法或setRange(float,float)方法设置幅度范围,
- 用setMinorTickCount(int)方法设置次网格的数量;
- 用tickCount()方法和 minorTickCount()方法分别获取网格和次网格的数量。
QLogValueAxis 的信号有
信号 | 参数 | 说明 |
---|---|---|
baseChanged(base) | base – float | 当轴的对数基数改变时,发出该信号。 |
labelFormatChanged(format) | format – str | 当轴标签的格式更改时,会发出此信号。 |
maxChanged(max) | max – float | 当轴的最大值(由max指定)发生变化时,会发出此信号。 |
minChanged(min) | min – float | 当轴的最小值(由min指定)发生变化时,会发出此信号。 |
minorTickCountChanged(minorTickCount) | minorTickCount – int | 当minorTickCount指定的轴上的次要刻度线数量发生变化时,会发出此信号。 |
rangeChanged(min,max) | min – float max – float | 当轴的最小值或最大值(由最小值和最大值指定)发生变化时,会发出此信号。 |
tickCountChanged(tickCount) | tickCount – int | 当tickCount指定的轴上的刻度线数量发生变化时,会发出此信号。 |
下面的程序,横坐标用数值坐标、纵坐标用对数坐标绘制图表,并对横坐标和纵坐标的显示进行设置,程序运行结果如图所示
# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/12 18:07
# File_name: 06-对数轴 QLogValueAxis.py
import sys,random
from PySide6.QtWidgets import QApplication,QWidget,QVBoxLayout
from PySide6 import QtCharts
from PySide6.QtCore import Qt
class MyWidget(QWidget):
def __init__(self,parent=None):
super().__init__(parent)
self.resize(1000,600)
v = QVBoxLayout(self)
chartView = QtCharts.QChartView(self)
v.addWidget(chartView)# 创建图表视图控件
chart = QtCharts.QChart()# 创建图表
chartView.setChart(chart)# 图表控件中设置图表
chart.setTitle("随机数据")# 设置图表的标题
lineSeries = QtCharts.QLineSeries()# 创建折线数据序列
lineSeries.setName("随机序列")# 设置数据序列的名称
random.seed(10000)
for i in range(101):
lineSeries.append(i,100000 * random.random())# 数据序列中添加数据
chart.addSeries(lineSeries)# 图表中添加数据序列
axis_x = QtCharts.QValueAxis()# 创建数值坐标轴
axis_x.setTitleText("Numbers")# 设置坐标轴的标题
axis_x.setTitleBrush(Qt.black)
axis_x.setLabelsColor(Qt.black)
axis_x.setRange(0,100)# 设置坐标轴的范围
axis_x.setTickCount(10)# 设置刻度的数量
axis_x.applyNiceNumbers()# 应用智能刻度标签
axis_x.setLinePenColor(Qt.black)# 设置坐标轴的颜色
pen = axis_x.linePen()# 获取坐标轴的钢笔
pen.setWidth(2)# 设置钢笔的宽度
axis_x.setLinePen(pen)# 设置坐标轴的钢笔
axis_x.setGridLineColor(Qt.gray)# 设置网格线的颜色
pen = axis_x.gridLinePen()# 获取网格线的钢笔
pen.setWidth(2)# 设置钢笔的宽度
axis_x.setGridLinePen(pen)# 设置网格线的宽度
axis_x.setMinorTickCount(3)# 设置次刻度的数量
axis_x.setLabelFormat("% 5,1f")# 设置标签的格式
axis_y = QtCharts.QLogValueAxis()# 建立对数坐标轴
axis_y.setBase(10.0)# 定义对数基
axis_y.setMax(100000.0)# 设置最大值
axis_y.setMin(100.0)# 设置最小值
axis_y.setTitleText("随机数据")# 设置标题
axis_y.setMinorTickCount(9)# 设置次网格线的数量
axis_y.setLabelFormat("%6d")# 设置格式
chart.setAxisX(axis_x,lineSeries)# 设置坐标轴的数据
chart.setAxisY(axis_y,lineSeries)# 设置坐标轴的数据
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWidget()
win.show()
sys.exit(app.exec())
QBarCategoryAxis
QBarCategoryAxis 主要用于定义条形图的坐标轴,添加条目也可用于定义折线图的坐标轴。
QBarCategoryAxis 的常用方法如表所示。
from PySide6.QtCharts import QBarCategoryAxis
QBarCategoryAxis(parent: Union[PySide6.QtCore.QObject,NoneType]= None)-> None
QBarCategoryAxis 的信号有
信号 | 参数 | 说明 |
---|---|---|
categoriesChanged() | 当轴的类别发生变化时,会发出此信号。 | |
countChanged() | 当轴的类别数发生变化时,会发出此信号。 | |
maxChanged(max) | max – str | 当轴的最大值发生变化时,会发出此信号。 |
minChanged(min) | min – str | 当轴的最小值发生变化时,会发出该信号。 |
rangeChanged(min,max) | min – str max – str | 当轴的最小值或最大值发生变化时,会发出该信号。 |
下面的程序,在一个图表中添加条形图和折线图,条形图和折线图使用相同的坐标轴程序运行结果如图所示。
# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/12 18:32
# File_name: 07-条形图的坐标轴QBarCategoryAxis.py
from PySide6.QtWidgets import QApplication,QWidget,QVBoxLayout
import sys
from PySide6.QtCore import Qt
from PySide6 import QtCharts
class MyWidget(QWidget):
def __init__(self,parent=None):
super().__init__(parent)
self.resize(1200,600)
v = QVBoxLayout(self)
self.chartView = QtCharts.QChartView(self)# 创建图表视图控件
v.addWidget(self.chartView)
self.chart = QtCharts.QChart()# 创建图表
self.chartView.setChart(self.chart)# 将图表加人到图表视图控件中
set1 = QtCharts.QBarSet("一组销售额")# 创建数据项
set1.append([12,34,23,45])# 添加数据
set2 = QtCharts.QBarSet("二组销售额")# 创建数据项
set2.append([24,33,42,41])# 添加数据
set3 = QtCharts.QBarSet("三组销售额")# 创建数据项
set3.append([21,44,23,40])# 添加数据
self.barSeries = QtCharts.QBarSeries()# 创建数据序列
self.barSeries.append([set1,set2,set3])# 添加数据项
self.lineSeries = QtCharts.QLineSeries()# 创建数据序列
self.lineSeries.setName("去年季度总额")
self.lineSeries.append(0,32)# 添加数据
self.lineSeries.append(1,46)
self.lineSeries.append(2,43)
self.lineSeries.append(3,48)
self.chart.addSeries(self.barSeries)# 图表中添加数据序列
self.chart.addSeries(self.lineSeries)# 图表中添加数据序列
# 创建坐标轴
self.barCategoryAxis = QtCharts.QBarCategoryAxis()
self.chart.addAxis(self.barCategoryAxis,Qt.AlignmentFlag.AlignBottom)# 图表中添加坐标轴
self.barCategoryAxis.append(["第一季度","第二季度","第三季度","第四季度"])
self.valueAxis = QtCharts.QValueAxis()# 创建数值坐标轴
self.chart.addAxis(self.valueAxis,Qt.AlignmentFlag.AlignRight)# 图表中添加坐标轴
self.valueAxis.setRange(0,50)# 设置坐标轴的数值范围
self.barSeries.attachAxis(self.valueAxis)# 数据项与坐标轴关联
self.barSeries.attachAxis(self.barCategoryAxis)# 数据项与坐标轴关联
self.lineSeries.attachAxis(self.valueAxis)# 数据项与坐标轴关联
self.lineSeries.attachAxis(self.barCategoryAxis)# 数据项与坐标轴关联
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWidget()
win.show()
sys.exit(app.exec())
QCategoryAxis
与QBarCategoryAxis 不同的是,QCategoryAxis 坐标轴可以定义每个条目的宽度,常用来放在竖直轴上,实现坐标轴不等分。
from PySide6.QtCharts import QCategoryAxis
QCategoryAxis(parent: Union[PySide6.QtCore.QObject,NoneType]= None)-> None
QCategoryAxis 的常用方法
- 用append(label:str,categoryEndValue:float)方法添加条目,其中 label是条目名称,categoryEndValue 是条目的终止值,一个条目的宽度是两个相邻条目的终止值的差,因此后加人的条目的终止值一定要大于先加入的条目的终止值;
- 用setStartValue(min: loat)方法设置坐标轴的起始值;
- 用startValue(categoryLabel=)方法获取条目的起始值;
- 用endValue(str)方法获取条目的终止值,
- 用setLabelsPosition(QCategoryAxis.AxisLabelsPosition)方法设置条目标签的位置,参数可取:
- QCategoryAxis.AxisLabelsPositionCenter(标签在条目中间位置)
- QCategoryAxis.AxisLabelsPositionOnValue(标签在条目的最大值处)
QCategoryAxis的方法与参数类型 | 返回值的类型 | 说明 |
---|---|---|
append(label: str,categoryEndValue: float) | None | 添加条目 |
categoriesLabels() | ListCstr] | 获取条目列表 |
count() | int | 获取条目的数量 |
endValue(categoryLabel:str) | float | 获取指定条目的终止值 |
remove(label:str) | None | 移除指定的条目 |
replaceLabel(oldLabel: str,newLabel: str) | None | 用新条目替换旧条目 |
setLabelsPosition(QCategoryAxis. AxisLabelsPosition) | None | 设置标签的位置 |
setStartValue(min:float) | None | 设置条目的最小值 |
stariValue(categoryLabel:str=') | float | 获取指定条目的起始值 |
QCategoryAxis的信号
信号 | 参数 | 说明 |
---|---|---|
categoriesChanged() | 当轴的类别发生变化时,会发出此信号。 | |
labelsPositionChanged(position) | position – AxisLabelsPosition | 标签位置更改,会发出此信号。 |
QCategoryAxis例子
下面的程序是将 QCategoryAxis 轴放在左侧,QCategoryAxis 轴的条目是销售等级分为"不及格"“及格”“良好”"优秀"和"超出预期"每个等级的宽度并不相等。程序运行结果如图所示。
# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/12 18:51
# File_name: 08-QCategoryAxis例子.py
from PySide6.QtWidgets import QApplication,QWidget,QVBoxLayout
import sys
from PySide6 import QtCharts
from PySide6.QtCore import Qt
class MyWidget(QWidget):
def __init__(self,parent=None):
super().__init__(parent)
self.resize(800,600)
v = QVBoxLayout(self)
self.chartView = QtCharts.QChartView(self)# 创建图表视图控件
v.addWidget(self.chartView)
self.chart = QtCharts.QChart()# 创建图表
self.chartView.setChart(self.chart)# 将图表加入到图表视图控件中
set1 = QtCharts.QBarSet("一组销售额")# 创建数据项
set1.append([12,34,23,45])# 添加数据
set2 = QtCharts.QBarSet("二组销售额")# 创建数据项
set2.append([24,33,42,41])# 添加数据
set3 = QtCharts.QBarSet("三组销售额")# 创建数据项
set3.append([21,44,23,40])# 添加数据
self.barSeries = QtCharts.QBarSeries()# 创建数据序列
self.barSeries.append([set1,set2,set3])# 添加数据项
self.chart.addSeries(self.barSeries)# 图表中添加数据序列
self.barCategoryAxis = QtCharts.QBarCategoryAxis()# 创建坐标轴
self.chart.addAxis(self.barCategoryAxis,Qt.AlignBottom)# 图表中添加坐标轴
self.barCategoryAxis.append(["第一季度""第二季度","第三季度","第四季度"])
self.categoryAxis = QtCharts.QCategoryAxis()# 创建数值坐标轴
self.categorvAxis = self.chart.addAxis(self.categoryAxis,Qt.AlignmentFlag.AlignLeft)# 图表中添加坐标轴
self.categoryAxis.setRange(0,60)# 设置坐标轴的数值范围
self.categoryAxis.append("不及格",10)# 添加条目
self.categoryAxis.append("及格",20)# 添加条目
self.categoryAxis.append("良好",25)# 添加条目
self.categoryAxis.append("优秀",42)# 添加条目
self.categoryAxis.append("超出预期",60)# 添加条目
self.categoryAxis.setStartValue(5)# 指定起始值
self.barSeries.attachAxis(self.categoryAxis)# 数据项与坐标轴关联
self.barSeries.attachAxis(self.barCategoryAxis)# 数据项与坐标轴关联
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWidget()
win.show()
sys.exit(app.exec())
QDateTimeAxis
QDateTimeAxis 轴用于设置时间坐标轴可用于XY图。
QDateTimeAxis 的常用方法
QDateTimeAxis 的常用方法如表所示,主要方法:
- 用setFormat(format:str)方法设置显示格式,显示格式可参考QDateTime 的格式;
- 用setMin(min:QDateTime)和 setMax(max:QDateTime)方法设置坐标轴显示的最小时间和最大时间;
- 用setTickCount(count;int)方法设置坐标轴的刻度数量。
在定义数据序列的值时,例如 QLineSeries 数据序列需要把X值转换成毫秒可以用QDateTime的 toMSecsSinceEpoch()方法转换否则数据序列与时间坐标轴的关联会出问题,时间坐标轴显示的时间不准确,可参考下面的实例
QDateTimeAxis的方法及参数类型 | 返回值的类型 | 说明 |
---|---|---|
setFormat(format:str) | None | 设置显示时间的格式 |
format() | Str | 获取格式 |
setMax(max: QDateTime) | None | 设置坐标轴的最大时间 |
max() | QDateTime | 获取最大时间 |
setMin(min:QDateTime) | None | 设置坐标轴的最小时间 |
min() | QDateTime | 获取最小时间 |
setRange(min: QDateTime,max: QDateTime) | None | 设置范围 |
setTickCount(count:int) | None | 设置刻度数量 |
tickCount() | int | 获取刻度数量 |
QDateTimeAxis的信号
信号 | 参数 | 说明 |
---|---|---|
formatChanged(format) | format – str | 当轴的格式改变时,会发出此信号。 |
maxChanged(max) | max – PySide6.QtCore.QDateTime | 当轴的最大值(由max指定)发生变化时,会发出此信号。 |
minChanged(min) | min – PySide6.QtCore.QDateTime | 当轴的最小值(由min指定)发生变化时,会发出此信号。 |
rangeChanged(min,max) | min – PySide6.QtCore.QDateTime max – PySide6.QtCore.QDateTime | 当轴的最小值或最大值(由最小值和最大值指定)发生变化时,会发出此信号。 |
tickCountChanged(tick) | tick – int | 当tickCount指定的轴上的刻度线数量发生变化时,会发出此信号。 |
QDateTimeAxis的实例
下面的程序用菜单打开 Excel 文件 price.xlsx,读取数据并绘制价格走势图,pricexlsx文件中第1列是时间,第2列和第 3列是价格。程序运行结果如图8-12所示。
# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/12 19:26
# File_name: 09-QDateTimeAxis的实例.py
import sys
from PySide6.QtWidgets import QApplication,QWidget,QVBoxLayout,QMenuBar,QFileDialog
from PySide6.QtCharts import QChartView,QChart,QLineSeries,QValueAxis,QDateTimeAxis
from PySide6.QtCore import QDateTime
from openpyxl import load_workbook
class MyWindow(QWidget):
def __init__(self,parent=None):
super().__init__(parent)
self.resize(1200,800)
self.setupUi()
def setupUi(self):
menuBar = QMenuBar()
fileMenu = menuBar.addMenu("文件(&E)")
fileMenu.addAction("打开(&O)").triggered.connect(self.action_open_triggered)
fileMenu.addSeparator()
fileMenu.addAction("退出(&Q)").triggered.connect(self.close)
chartView = QChartView()
v = QVBoxLayout(self)
v.addWidget(menuBar)
v.addWidget(chartView)
self.chart = QChart()
chartView.setChart(self.chart)
def action_open_triggered(self): # 打开 Excel文档,读取数据
fileName,fil = QFileDialog.getOpenFileName(self,"打开测试文件",".","Excel(*.xlsx)")
if fileName and fil =="Excel(*.xlsx)":
print("进来了")
dateTimeList = list()# 时间列表
valueList_1 = list()# 数值列表
valueList_2 = list()# 数值列表
wb = load_workbook(fileName)
ws = wb.active
for row in ws.rows:
valueList_1.append(row[1].value)# 添加数值数据
valueList_2.append(row[2].value)# 添加数值数据
dateTimeList.append(QDateTime(row[0].value))# 添加时间数据
self.plot(dateTimeList,valueList_1,valueList_2)# 调用绘制图表函数
def plot(self,dateTimeList,valueList_1,valueList_2): # 绘制图表的函数
lineSeries_1 = QLineSeries(self)# 第1个数据序列
lineSeries_1.setName("价格1")
lineSeries_2 = QLineSeries(self)# 第2个数据序列
lineSeries_2.setName("价格2")
for i in range(len(dateTimeList)):
msec = float(dateTimeList[i].toMSecsSinceEpoch())# 换算成毫秒
lineSeries_1.append(msec,valueList_1[i])# 第1个数据序列添加数据
lineSeries_2.append(msec,valueList_2[i])# 第2个数据序列添加数据
dateTimeAxis = QDateTimeAxis(self)# 创建时间坐标轴
dateTimeAxis.setRange(dateTimeList[0],dateTimeList[len(dateTimeList)- 1])
dateTimeAxis.setFormat('yyyy - MM -.dd HH:mm')
dateTimeAxis.setTickCount(8)
valueAxis = QValueAxis(self)# 创建数值坐标轴
self.chart.removeAllSeries()
self.chart.removeAxis(self.chart.axisX())
self.chart.removeAxis(self.chart.axisY())
self.chart.addSeries(lineSeries_1)
self.chart.addSeries(lineSeries_2)
self.chart.setAxisX(dateTimeAxis,lineSeries_1)# 图表设置 X轴
self.chart.setAxisY(valueAxis,lineSeries_1)# 图表设置Y轴
self.chart.setAxisX(dateTimeAxis,lineSeries_2)# 图表设置 X轴
self.chart.setAxisY(valueAxis,lineSeries_2)# 图表设置Y轴
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec())