首页 > 其他分享 >【PySide6】QChart笔记(二)—— QBarSeries的使用

【PySide6】QChart笔记(二)—— QBarSeries的使用

时间:2023-11-10 22:24:42浏览次数:30  
标签:set series QChart self chart PySide6 QBarSeries QBarSet

一、QBarSeries简介

1. 官方描述

https://doc.qt.io/qtforpython-6/PySide6/QtCharts/QBarSeries.html
【译注:官方文档内容过于简洁,表明完全仅继承了QAbstractBarSeries,且没有扩展任何属性、方法和信号。因此,直接参考QAbstractBarSeries的文档:】
https://doc.qt.io/qtforpython-6/PySide6/QtCharts/QAbstractBarSeries.html

在条形图中,条形被定义为每个类别(category,x轴划分的一个区间)包含一个数据值的条形集合(bar set)。条形的位置由类别指定,其高度由数据值指定。包含多个条形集合的条形序列(bar series)将属于同一类别的条形组合在一起。条形图的样式由所选的 QAbstractBarSeries 子类 ( QBarSeries, QStackedBarSeries, QPercentBarSeries, QHorizontalStackedBarSeries, QHorizontalPercentBarSeries, QHorizontalBarSeries ) 来决定。

1.1 属性

属性 描述
barWidth 序列中条形的宽度
count 序列中条形集合的数量
labelsAngle 数值标签的角度(单位为度)。数值标签是标注在条形上,表示该条形的值的标签
labelsFormat 数值标签的显示格式。通过 setLabelsFormat(str) 方法实现,入参字符串中通过'@value'表示引用数值。一个例子:setLabelsFormat('@value km')
labelsPosition 数值标签的位置
labelsPrecision 数值标签中显示的最大有效位数
labelsVisible 数值标签的可见性。默认为False

1.2 信号

信号 描述
hovered(status, index, barset) 鼠标悬停到条形,或离开条形时触发,发送三个数据。鼠标悬停到条形时,status为True,离开时为False;index的值为条形在条形组(bar set)中的编号;barset的值为对应的QBarSet对象。可以通过 QBarSet.label() 获取该条形组的名称,还可以通过 QBarSet.at(index) 获取该条形的数值

2. 官方用例

https://doc.qt.io/qtforpython-6/examples/example_charts_barchart.html
该用例绘制了每组包含5种数据的条形图。

image

2.1 创建条形图

# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

"""PySide6 port of the linechart example from Qt v6.x"""

import sys

from PySide6.QtCharts import (QBarCategoryAxis, QBarSeries, QBarSet, QChart,
                              QChartView, QValueAxis)
from PySide6.QtCore import Qt
from PySide6.QtGui import QPainter
from PySide6.QtWidgets import QApplication, QMainWindow


class TestChart(QMainWindow):
    def __init__(self):
        super().__init__()

        # 创建QBarSet。每组条形有5种数据,因此需要创建5个
        self.set_0 = QBarSet("Jane")
        self.set_1 = QBarSet("John")
        self.set_2 = QBarSet("Axel")
        self.set_3 = QBarSet("Mary")
        self.set_4 = QBarSet("Samantha")

        # 向各QBarSet添加数据
        self.set_0.append([1, 2, 3, 4, 5, 6])
        self.set_1.append([5, 0, 0, 4, 0, 7])
        self.set_2.append([3, 5, 8, 13, 8, 5])
        self.set_3.append([5, 6, 7, 3, 4, 5])
        self.set_4.append([9, 7, 5, 3, 1, 2])

        # 创建QBarSeries,并将QBarSet加入其中
        self.series = QBarSeries()
        self.series.append(self.set_0)
        self.series.append(self.set_1)
        self.series.append(self.set_2)
        self.series.append(self.set_3)
        self.series.append(self.set_4)

        # 创建QCahrt,并与QBarSeries绑定
        self.chart = QChart()
        self.chart.addSeries(self.series)
        self.chart.setTitle("Simple barchart example")
        self.chart.setAnimationOptions(QChart.SeriesAnimations)

        # 不同于QXYSeries,条形图的x轴标签直接与QBarCategoryAxis绑定
        self.categories = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
        self.axis_x = QBarCategoryAxis()
        self.axis_x.append(self.categories)
        # 将x轴先后与QChart、QBarSeries绑定
        self.chart.addAxis(self.axis_x, Qt.AlignBottom)
        self.series.attachAxis(self.axis_x)

        self.axis_y = QValueAxis()
        self.axis_y.setRange(0, 15)
        # 将y轴先后与QChart、QBarSeries绑定
        self.chart.addAxis(self.axis_y, Qt.AlignLeft)
        self.series.attachAxis(self.axis_y)

        self.chart.legend().setVisible(True)
        self.chart.legend().setAlignment(Qt.AlignBottom)

        self._chart_view = QChartView(self.chart)
        self._chart_view.setRenderHint(QPainter.Antialiasing)

        self.setCentralWidget(self._chart_view)


if __name__ == "__main__":
    app = QApplication(sys.argv)

    window = TestChart()
    window.show()
    window.resize(420, 300)
    sys.exit(app.exec())

二、实践

1. 用例说明

用每日收支数据绘制条形图。

image

2. 代码实现

from PySide6.QtCharts import QChart, QChartView, QBarSet, QBarSeries, QBarCategoryAxis
from PySide6.QtGui import QPainter
from PySide6.QtCore import Qt, QDateTime
from PySide6.QtWidgets import QApplication, QMainWindow

app = QApplication([])
window = QMainWindow()
chart = QChart()
chart.setTitle('收支统计')

# 准备数据
axisX_date = [QDateTime.currentDateTime().addDays(i) for i in range(5)]
axisY_value1 = [10 - 2 * i for i in range(5)]
axisY_value2 = [5 + i * (-1) ** i for i in range(5)]

# 创建条形图集合set【每个set都是条形图中一种待展示的数据类别】
bar_set_expense = QBarSet('支出')
bar_set_income = QBarSet('收入')
# 将值传入条形图集合set【通过列表的形式,存入某种数据类别的一组数值】
for i in range(5):
    bar_set_expense.append(axisY_value1[i])
    bar_set_income.append(axisY_value2[i])

# 创建条形图序列series【series只与QChart有关,而与待展示数据的种类无关,因此只需创建一个】
bar_series = QBarSeries()
# 将数据集合存入series
bar_series.append(bar_set_expense)
bar_series.append(bar_set_income)

# 将series加入chart
chart.addSeries(bar_series)

# 尝试另一种坐标创建方法:先创建默认坐标系,再创建自定义坐标轴,最后仅替换对应的坐标轴
chart.createDefaultAxes()

# 创建条形图坐标轴
axis_x = QBarCategoryAxis()
# 必须是字符串列表,以便得到预期格式
axis_x.append([date.toString("yyyy/MM/dd") for date in axisX_date])
# 替换原x轴
chart.removeAxis(chart.axes(Qt.Orientation.Horizontal)[0])
chart.addAxis(axis_x, Qt.AlignBottom)
bar_series.attachAxis(axis_x)

# 【注意】也许你会在网上看到如下方法的使用。具体情况参考“三、问题与总结”
# 未来将不支持的方法:chart.removeAxis(chart.axisX())
# 未来将不支持的方法:chart.setAxisX(axis_x, bar_series)

# 显示图表
chartView = QChartView(chart)
chartView.setRenderHint(QPainter.Antialiasing)
window.setCentralWidget(chartView)
window.show()
app.exec()

三、问题与总结

1. DeprecationWarning: Function: 'QChart.axisX(QAbstractSeries * series) const' is marked as deprecated, please check the documentation for more information

问题描述

当调用QChart.axisX()Qchart.setAxisX()等方法时,得到该警告。原因是这些方法被标记为“不支持的方法”,应当通过其他方法实现。

解决方法

对于QChart.axisX()

替换为:

# defination
def Qchart.axes(self, orientation: Orientation,
                series: QAbstractSeries | None) -> list[QAbstractAxis]

# example: 获取第一个水平坐标轴
axis_x = chart.axes(Qt.Orientation.Horizontal)[0]

对于QChart.setAxisX()

没有对应的方法可以替代,但可以更改为以下几个步骤:

# defination
chart.removeAxis(chart.axes(Qt.Orientation.Horizontal)[0])
chart.addAxis(axis_x, Qt.AlignBottom)
series.attachAxis(axis_x)

2. 更新条形图的正确代码顺序

问题描述

当需要展示多种意义的数据时,不同于QXYSeries及其派生类序列,条形图QChart只需与一个QBarSeries绑定。在这个唯一的QBarSeries中,多种意义的数据通过多个QBarSet表示。

当更新条形图时,只需更新QBarSeries内的各个QBarSet(与其说是更新,更像是丢弃重造)。因此,实现该过程的代码会与QXYSeries类的图表有所差异(主要在于数据传入的部分)。

解决方法

  • 清除 QBarSeries 对象中的旧数据,即调用QBarSeries.clear()
  • 对于每种数据,创建 QBarSet 对象,并将数据写入 QBarSet 对象, 即调用QBarSet.append()
  • 将每个 QBarSet 对象加入 QBarSeries 对象, 即调用QBarSeries.append()
  • 【仅需一次】将 QBarSeries 对象与 QChart 对象绑定,即调用QChart.addSeries()
  • 删除旧坐标轴 QAbstractAxis 对象,并重新创建。其中,x轴为 QBarCategoryAxis 对象
  • 将新 QAbstractAxis 对象与 QChart 对象绑定,即调用QChart.addAxis()
  • 将新 QAbstractAxis 对象与 QBarSeries 对象绑定,即调用QBarSeries.attachAxis()

标签:set,series,QChart,self,chart,PySide6,QBarSeries,QBarSet
From: https://www.cnblogs.com/LinfengBingyi/p/17816325.html

相关文章

  • qt QCharts 设置背景,背景透明
     classChartwidget:publicQChartViewvoidChartwidget::setBackground(){m_chart->setBackgroundVisible(false);//去背景QColorcolor(255,255,255,0);QPalettepal(palette());pal.setColor(QPalette::Window,color);setAutoFillBac......
  • Vscode 安装pyside6
    1.在VScode扩展中安装pyqtintegration2.pyqtintegration设置pyrcc;pyuic;Qtdesigner的路径 ......
  • Pyside6多继承的坑(继承QWidget)
    python中支持多继承,并且可以针对不同父类传入不同的参数进行初始化:classA:def__init__(self,text):print(text)classB:def__init__(self,text):print(text)passclassC(B,A):def__init__(self):B.__init__(self,......
  • 解决QT QGraphicsView提升到QChartView报错的问题
    使用QT提供的QChartView来绘制图表,提升QGraphicsView控件继承QChartView后,然后将QGraphicsView提升到我们自己写的类,怎么才能确保提升后编译不报错呢。[问题描述]使用QGraphicsView显示图表的时候,我们需要将它提升为QChartView.但提升后再此运行一般会发生编译报错,错误发生在......
  • 把 PySide6 移植到安卓上去!
    官方教程在此:https://www.qt.io/blog/taking-qt-for-python-to-android寥寥几句,其实不少坑。凭回忆写的,可能不是很全(无招胜有招)仅支持Linux环境QT环境安装从http://mirrors.ustc.edu.cn/qtproject/official_releases/online_installers/下载在线安装器。新版本的安装......
  • 十六、QChart图表
    1.添加图表模块.pro文件中加入charts模块QChart类图表的类QChartView类显示图表的类2.ui文件中使用chartView控件选择本类的父类QGrapicsView控件,然后右键控件,将添加的控件提升为QChartView控件。 3.将QChartView类的命名控件添加进项目使用宏QT_CHA......
  • Pyside6-QtCharts+psutil实战-绘制一个CPU监测工具
    今天是实战篇章,我们结合可以快速提升我们开发效率的工具一起开实战一波实时读取系统CPU使用情况的折线图。使用的开发工具QtDesigner来开发UI界面。十分便捷。使用起来也算比较的简单了,虽然也存在不少的BUG。对所需要的控件进行拖拽式,就OK。后续会出一个简单的视频录制。第二步,......
  • PySide6(Qt for Python) QTableWidget表头边框线问题
    这个问题是在Windows10平台下特有问题。网络上有很多QtC++的解决方案。但是没有特定的PySide6的解决方案(以下是参考的QtC++的解决方案)。链接:https://blog.csdn.net/qq_22642239/article/details/122863344问题描述C++的解决方案是设置纵横表头的样式表:horizontalHeader,v......
  • PySide6、PyQt6、ui文件转py文件、Qt Designer 使用
    QT官网:https://www.qt.io/zh-cn/develop1、PySide6、*PyQt6、PyQt5*PySide6、PySide2、PyQt5都是基于Qt库,Qt是一组C++库和开发工具,包括图形用户界面、网络、线程、正则表达式、SQL数据库、SVG、OpenGL、XML、用户和应用程序设置、定位和定位服务、短程通信(NFC和蓝牙)......
  • PySide6 项目开发
    Prerequisite在之前的博客(PyQt6/PySide6)讲了基础,这篇博客就是项目实战的过程(人工智能+PySide6)项目参考:B站教程风格组件:PySide6-Fluent-Widgets(虽然这次没用到,下次做项目一定会用到!!)基于人工智能的图片动漫化项目地址:xxx【成品图片】目标功能:AnimeGANv2基础功能实......