1. 引言
PySide6 是 Qt 官方的 Python 绑定库,不仅提供了强大的 GUI 开发能力,还内置了 QtCharts 模块,能够以原生渲染的方式绘制高质量的统计图表。相比于 Matplotlib 等第三方库,PySide6 的图表在交互性、主题适配以及嵌入桌面应用时的性能表现上更具优势。
本教程将详细介绍如何使用 PySide6 制作三种最常用的统计图表:饼图、条形图和折线图。每个案例均包含完整的可运行代码,帮助你快速掌握核心 API 的使用。
环境准备:请确保已安装 PySide6。
2. 饼图的制作方法及完整代码案例
饼图适用于展示各部分在整体中的占比情况。在 PySide6 中,核心类为 QPieSeries 和 QPieSlice。
核心步骤
- 创建
QPieSeries对象。 - 使用
append()方法添加标签和数值。 - 创建
QChart并将 Series 添加进去。 - 使用
QChartView展示图表。
完整代码案例
python
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("JavaScript", 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。
完整代码案例
python
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渲染。
完整代码案例
python
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 的图表模块还支持散点图、面积图、极坐标图等多种类型,且支持鼠标交互、缩放和自定义主题。掌握以上三种基础图表后,你可以轻松扩展到更复杂的数据可视化场景。