使用PySide6的QtCharts模块制作三种常见统计图表的方法
基于PySide6的QtCharts模块,介绍饼图、条形图和折线图制作方法。三种图表均遵循Series→Chart→ChartView三层结构,需手动创建QChart对象、添加QSeries并绑定坐标轴,同时启用抗锯齿渲染,以实现高质量数据可视化。
1. 引言
要说Python桌面开发,PySide6绝对是绕不开的一个选择。作为Qt官方的Python绑定库,它不光能搞定各种花哨的界面,还自带了QtCharts模块,能以原生渲染的方式画出质量很高的统计图表。跟Matplotlib这类第三方库一比,PySide6的图表在交互性、主题适配,尤其是嵌入桌面应用时的性能表现上,优势还是挺明显的。
这篇教程,就来聊聊怎么用PySide6做出三种最常用的统计图表:饼图、条形图和折线图。每个案例都配了完整的、可以直接跑起来的代码,目的就是让你能快速上手核心API。
环境准备:请确保已安装PySide6。
2. 饼图的制作方法及完整代码案例
饼图这东西,最适合展示各部分在整体中的占比关系。在PySide6里,核心就是QPieSeries和QPieSlice这两个类。
核心步骤
- 创建
QPieSeries对象。 - 用
append()方法往里添加标签和数值。 - 创建
QChart,把Series加进去。 - 最后用
QChartView展示图表。
完整代码案例
import sys
from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtCharts import QChart, QChartView, QPieSeries
from PySide6.QtGui import QPainter
class PieChartWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("PySide6 饼图示例")
self.resize(600, 400)
# 1. 创建饼图系列
series = QPieSeries()
series.append("Python", 45)
series.append("C++", 25)
series.append("Ja vaScript", 20)
series.append("Go", 10)
# 可选:设置某一块突出显示
slice_obj = series.slices()[0]
slice_obj.setExploded()
slice_obj.setLabelVisible(True)
# 2. 创建图表并添加系列
chart = QChart()
chart.addSeries(series)
chart.setTitle("编程语言使用占比")
chart.legend().setVisible(True)
# 3. 创建视图
chart_view = QChartView(chart)
chart_view.setRenderHint(QPainter.RenderHint.Antialiasing)
self.setCentralWidget(chart_view)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = PieChartWindow()
window.show()
sys.exit(app.exec())

3. 条形图的制作方法及完整代码案例
条形图,或者叫柱状图,用来对比不同类别的数值大小再合适不过了。PySide6里靠的是QBarSeries、QBarSet和QBarCategoryAxis这几个家伙。
核心步骤
- 创建
QBarSet来定义数据系列。 - 创建
QBarSeries,把Set加进去。 - 配置X轴(类别轴)和Y轴(数值轴)。
- 把Series和Axis都绑定到
QChart上。
完整代码案例
import sys
from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtCharts import (
QChart, QChartView, QBarSeries, QBarSet,
QBarCategoryAxis, QValueAxis
)
from PySide6.QtGui import QPainter, Qt
class BarChartWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("PySide6 条形图示例")
self.resize(700, 450)
# 1. 定义数据
set1 = QBarSet("2023年")
set2 = QBarSet("2024年")
set1.append([10, 20, 30, 40])
set2.append([15, 25, 35, 45])
# 2. 创建条形图系列
series = QBarSeries()
series.append(set1)
series.append(set2)
# 3. 创建图表
chart = QChart()
chart.addSeries(series)
chart.setTitle("季度销售额对比")
chart.setAnimationOptions(QChart.AnimationOption.SeriesAnimations)
# 4. 配置 X 轴(类别)
categories = ["Q1", "Q2", "Q3", "Q4"]
axis_x = QBarCategoryAxis()
axis_x.append(categories)
chart.addAxis(axis_x, Qt.AlignmentFlag.AlignBottom)
series.attachAxis(axis_x)
# 5. 配置 Y 轴(数值)
axis_y = QValueAxis()
axis_y.setTitleText("销售额 (万元)")
chart.addAxis(axis_y, Qt.AlignmentFlag.AlignLeft)
series.attachAxis(axis_y)
chart.legend().setVisible(True)
# 6. 创建视图
chart_view = QChartView(chart)
chart_view.setRenderHint(QPainter.RenderHint.Antialiasing)
self.setCentralWidget(chart_view)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = BarChartWindow()
window.show()
sys.exit(app.exec())

4. 折线图的制作方法及完整代码案例
折线图是用来展示数据随时间或有序类别变化趋势的利器。核心类就是QLineSeries。
核心步骤
- 创建
QLineSeries,用append(x, y)方法往里加数据点。 - 创建
QChart,把Series加进去。 - 配置坐标轴(X轴一般放类别或时间,Y轴放数值)。
- 最后用
QChartView渲染出来。
完整代码案例
import sys
from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtCharts import QChart, QChartView, QLineSeries, QValueAxis
from PySide6.QtGui import QPainter
from PySide6.QtCore import Qt
class LineChartWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("PySide6 折线图示例")
self.resize(700, 450)
# 1. 创建折线系列
series = QLineSeries()
series.setName("用户增长")
series.append(0, 100)
series.append(1, 150)
series.append(2, 180)
series.append(3, 250)
series.append(4, 320)
series.append(5, 400)
# 2. 创建图表
chart = QChart()
chart.addSeries(series)
chart.setTitle("月度用户增长趋势")
chart.setAnimationOptions(QChart.AnimationOption.SeriesAnimations)
# 3. 配置坐标轴
axis_x = QValueAxis()
axis_x.setTitleText("月份")
axis_x.setRange(0, 5)
chart.addAxis(axis_x, Qt.AlignmentFlag.AlignBottom)
series.attachAxis(axis_x)
axis_y = QValueAxis()
axis_y.setTitleText("用户数")
axis_y.setRange(0, 500)
chart.addAxis(axis_y, Qt.AlignmentFlag.AlignLeft)
series.attachAxis(axis_y)
chart.legend().setVisible(True)
# 4. 创建视图
chart_view = QChartView(chart)
chart_view.setRenderHint(QPainter.RenderHint.Antialiasing)
self.setCentralWidget(chart_view)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = LineChartWindow()
window.show()
sys.exit(app.exec())

5. 总结
通过这篇教程,我们基本掌握了用PySide6的QtCharts模块绘制三种基础图表的方法:
| 图表类型 | 核心类 | 适用场景 |
|---|---|---|
| 饼图 | QPieSeries | 展示部分与整体的比例关系 |
| 条形图 | QBarSeries, QBarSet | 对比不同类别的数值大小 |
| 折线图 | QLineSeries | 展示数据随时间/顺序的变化趋势 |
关键要点回顾
- 统一架构:所有图表都遵循
Series → Chart → ChartView的三层结构,就像搭积木一样清晰。 - 坐标轴绑定:条形图和折线图需要手动创建坐标轴,并通过
attachAxis()与 Series 关联起来,这一步别漏了。 - 抗锯齿:务必调用
setRenderHint(QPainter.RenderHint.Antialiasing),这能让图表看起来平滑很多,视觉效果直接提升一个档次。 - 动画支持:通过
setAnimationOptions()可以为图表添加生动的过渡动画,数据变化时看起来更流畅。
说真的,PySide6的图表模块远不止这些。它还能支持散点图、面积图、极坐标图等多种类型,而且鼠标交互、缩放、自定义主题这些功能都做得不错。掌握了这三种基础图表,应付大多数数据可视化的场景应该问题不大,想继续深入探索的话,路也铺好了。


































