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

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. 用例说明
用每日收支数据绘制条形图。

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()
【PySide6】QChart笔记(二)—— QBarSeries的使用的更多相关文章
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}
笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...
- Mastering Web Application Development with AngularJS 读书笔记(二)
第一章笔记 (二) 一.scopes的层级和事件系统(the eventing system) 在层级中管理的scopes可以被用做事件总线.AngularJS 允许我们去传播已经命名的事件用一种有效 ...
- Python 学习笔记二
笔记二 :print 以及基本文件操作 笔记一已取消置顶链接地址 http://www.cnblogs.com/dzzy/p/5140899.html 暑假只是快速过了一遍python ,现在起开始仔 ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- webpy使用笔记(二) session/sessionid的使用
webpy使用笔记(二) session的使用 webpy使用系列之session的使用,虽然工作中使用的是django,但是自己并不喜欢那种大而全的东西~什么都给你准备好了,自己好像一个机器人一样赶 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- 《MFC游戏开发》笔记二 建立工程、调整窗口
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9300383 作者:七十一雾央 新浪微博:http:/ ...
- JavaScript基础笔记二
一.函数返回值1.什么是函数返回值 函数的执行结果2. 可以没有return // 没有return或者return后面为空则会返回undefined3.一个函数应该只返回一种类型的值 二.可变 ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
随机推荐
- pandas 根据列的值选取所有行
原文链接:https://blog.csdn.net/changzoe/article/details/82348913 在其他论坛上看到的,原文链接如上所示.为方便记忆,原文如下所示: 选取等于某些 ...
- return true 与 return false的妙用——jQuery
var arr = [1, 3, 5,7,9]; jQuery.each(arr, function(key, value){ if(key === 2){ return true; } consol ...
- pandas 生成新的Dataframe
选择某些列 import pandas as pd # 从Excel中读取数据,生成DataFrame数据 # 导入Excel路径和sheet name df = pd.read_excel(exce ...
- 部署安装maven和mvnd
前言 maven是常见的java构建工具,优点是稳定可靠,缺点是构建太慢,maven-mvnd是maven的强化版,致力于提高构建速度,默认情况下,mvnd 使用多核CPU并行构建. 常见的java构 ...
- 使用canvas(2d)+js实现一个简单的傅里叶级数绘制方波图
先看效果 查看页面右下角,嘿嘿 简要说明 创建具有不同半径与角速度的圆集合:(截图中展现的效果为5个,代码是30个,运行后效果会不同) const getCircles = (N = 10) => ...
- WPF-实现屏幕截图(一)
源码路径:https://gitee.com/LiuShuiRuoBing/wpf_screen_cut 实现功能 实现基本的截屏窗体 鼠标随意选择截图区域 鼠标抬起时弹出按钮区 快捷键Ctrl+Al ...
- 《SQL与数据库基础》01. SQL概述 · 分类
目录 SQL概述 SQL语法特征 SQL分类 本文以 MySQL 为例 SQL概述 SQL(Structured Query Language),结构化查询语言,用于访问和处理数据库的标准的计算机语言 ...
- MySQL 慢查询探究分析
背景: 性能测试过程中,数据库往往是造成性能瓶颈之一,而数据库瓶颈中sql 语句又是值得探究分析的一环,其中慢查询是重点优化对象,在MySQL中,慢查询是指查询执行时间较长或者消耗 较多资源的查询语句 ...
- 【matplotlib基础】--坐标轴
Matplotlib的坐标轴是用于在绘图中表示数据的位置的工具. 坐标轴是图像中的水平和垂直线,它们通常表示为 x 轴和 y 轴.坐标轴的作用是帮助观察者了解图像中数据的位置和大小,通常标有数字或标签 ...
- JavaWeb项目开发环境搭建
1. 安装JDK1.8 2. 安装Tomcat8 此处安装解压版apache-tomcat-8.0.47,直接将压缩包解压到指定目录即可.例如,D:\apache-tomcat-8.0.47 3. 安 ...