127-绘制二维图表-图表的坐标轴

图表的坐标轴

要正确显示数据序列所表示的图表,需要给数据序列关联坐标轴,根据数据序列的类型关联对应类型的坐标轴。

图表的坐标轴类型和继承关系如图 所示,坐标轴的类型有:

  • QValueAxis
  • QLogValueAxis
  • QBarCategoryAxis
  • QCategoryAxis
  • QDataTimeAxis

它们都是从QAbstractAxis 继承而来的.

image-20230312173321607

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指定的轴上的刻度线数量发生变化时,会发出此信号。

下面的程序,横坐标用数值坐标、纵坐标用对数坐标绘制图表,并对横坐标和纵坐标的显示进行设置,程序运行结果如图所示

image-20230312182102327

# -*- 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
当轴的最小值或最大值发生变化时,会发出该信号。

下面的程序,在一个图表中添加条形图和折线图,条形图和折线图使用相同的坐标轴程序运行结果如图所示。

image-20230312184409176

# -*- 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 轴的条目是销售等级分为"不及格"“及格”“良好”"优秀"和"超出预期"每个等级的宽度并不相等。程序运行结果如图所示。

image-20230312192018568

# -*- 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所示。

image-20230312195258054

# -*- 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())

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用 QtCharts 进行二维坐标图绘制的基本步骤如下: 1. 引入头文件 在代码中引入 QtCharts 模块的头文件: ```cpp #include <QtCharts> ``` 2. 创建 QChart 对象 创建一个 QChart 对象,用于绘制图表: ```cpp QChart *chart = new QChart; ``` 3. 设置图表标题 使用 setTitle() 函数设置图表的标题: ```cpp chart->setTitle("My Chart"); ``` 4. 创建数据系列 使用 QLineSeries、QScatterSeries 或 QBarSeries 等类创建数据系列,分别用于绘制线图、散点图或柱状图: ```cpp QLineSeries *series = new QLineSeries; ``` 5. 添加数据 使用 append() 函数向数据系列中添加数据: ```cpp series->append(0, 1); series->append(1, 3); series->append(2, 4); ``` 6. 将数据系列添加到图表中 使用 addSeries() 函数将数据系列添加到图表中: ```cpp chart->addSeries(series); ``` 7. 创建坐标轴 使用 QValueAxis 或 QDateTimeAxis 等类创建 X 轴或 Y 轴: ```cpp QValueAxis *axisX = new QValueAxis; axisX->setTitleText("X Axis"); chart->addAxis(axisX, Qt::AlignBottom); QValueAxis *axisY = new QValueAxis; axisY->setTitleText("Y Axis"); chart->addAxis(axisY, Qt::AlignLeft); ``` 8. 将坐标轴添加到图表中 使用 addAxis() 函数将 X 轴或 Y 轴添加到图表中: ```cpp series->attachAxis(axisX); series->attachAxis(axisY); ``` 9. 显示图表图表添加到视图中,并显示出来: ```cpp QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); chartView->show(); ``` 以上是使用 QtCharts 进行二维坐标图绘制的基本步骤,可以根据具体的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日,当挖目相待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值