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

这篇具有很好参考价值的文章主要介绍了【PySide6】QChart笔记(二)—— QBarSeries的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、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种数据的条形图。

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

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. 用例说明

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

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

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类的图表有所差异(主要在于数据传入的部分)。文章来源地址https://www.toymoban.com/news/detail-746100.html

解决方法

  • 清除 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()

到了这里,关于【PySide6】QChart笔记(二)—— QBarSeries的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python学习笔记——PySide6设计GUI应用之UI与逻辑分离

    1、打开PySide6的UI设计工具pyside6-designer,设计一个主窗口,保存文件名为testwindow.ui 2、使用PySide6的RCC工具把testwindow.ui文件转换为testwindow_rc.py文件,此文件中有一个类Ui_MainWindow(包含各种控件对象) 一、通过类继承实现: class TestMainWindow(QMainWindow, Ui_MainWindow): 定义了一个新的

    2024年04月16日
    浏览(56)
  • Pyside6在Pycharm下安装和使用

    目录 一:安装 二:使用 一:安装 打开Pycharm编辑器,file-setting里Python解释器,点击小+号,添加模块,搜索Pyside6,安装 安装报错,可能是默认的库安装超时,用其他的源 pip install Pyside6 -i https://pypi.tuna.tsinghua.edu.cn/simple 安装成功 二:使用 建立一个窗口: import sys from PySide6.Q

    2024年01月23日
    浏览(59)
  • 使用pyside6将ui文件转换为py

    在MainWindow.ui文件所在文件夹搜索栏输入cmd,点击回车键; 示意图如下: 直接输入下述代码: 示意图如下:

    2024年04月23日
    浏览(41)
  • Python GUI框架---- PySide6安装与使用 - 打包部署

    安装Python和PySide6 :首先,确保已经安装了Python和PySide6 。你可以从Python官方网站(https://www.python.org)下载并安装Python,然后使用pip命令安装PySide6 。 设计GUI界面:使用Qt Designer工具来设计GUI界面。Qt Designer是一个可视化的界面设计工具,可以帮助你创建和布局GUI界面。你可以

    2024年04月09日
    浏览(48)
  • PySide6:Qt Designer UI文件的两种使用方式

    通过Qt Designer(PyQt6与PySide6对应的Designer设计的界面生成的UI文件有区别)设计的界面会生成对应的UI文件,一般会使用PyUIC工具将UI文件转换为对应的Py文件来使用,后面每次界面发生更新时都要重新转换一次,比较麻烦;另外,如果直接在UI文件中添加自己的代码,如信号与槽

    2024年02月11日
    浏览(49)
  • pyside6 安装

    学习 pyside6 有很多的教程: pythonguis网站-pyside6教程 pyside官网 pyqt 和 pyside 的 api其实差不多,最大的区别是License,pyqt是GPL协议,pyside是LGPL协议。 前者不能商用,如果使用了pyqt,程序就要开源,商用必须支付购买费用,不然会吃官司,而后者可以商用。常见开源协议。 在版

    2024年02月15日
    浏览(50)
  • PySide6精简教程

    近几年,受益于人工智能的崛起,Python语言几乎以压倒性优势在众多编程语言中异军突起,成为AI时代的首选语言。在很多情况下,我们想要以图形化方式将我们的人工智能算法打包提供给用户使用,这时候选择以python为主的GUI框架就非常合适了。 QT是众多GUI框架里面非常著

    2024年02月03日
    浏览(47)
  • pyside6上位机开发

    ini文件

    2024年02月07日
    浏览(47)
  • Pyside6:加载.ui

    通常来说开发Qt的界面基本都在Qt Designer中进行的,它保存的文件为.ui,我们可以通过uic将其转变为.py文件(如何使用:Pyside6:安装及Pycharm配置_pyside6安装pycharm-CSDN博客)。 那么该如何进行加载呢?大致来说有两种方法: 这个非常简单,无需把.ui文件进行转换,但 loader.loa

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包