在桌面应用开发中,数据可视化是常见需求。PySide6作为Qt官方的Python绑定,内置了QtCharts模块,相比Matplotlib等第三方库,其图表能原生嵌入GUI窗口,支持交互、主题适配和性能优化。本文通过三个完整示例,演示如何使用PySide6的QtCharts模块制作饼图、条形图和折线图。
环境要求:已安装PySide6(pip install pyside6)。
## 1. 饼图(QPieSeries)
饼图适合展示各部分占整体的比例。核心类为QPieSeries和QPieSlice。
实现步骤:
- 创建QPieSeries对象,使用append()添加标签和数值。
- 可通过slices()获取切片对象,设置突出显示(setExploded)和标签可见(setLabelVisible)。
- 创建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)
- # 创建饼图系列
- 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)
- # 创建图表
- chart = QChart()
- chart.addSeries(series)
- chart.setTitle("编程语言使用占比")
- chart.legend().setVisible(True)
- # 创建视图
- 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())
复制代码
## 2. 条形图(QBarSeries)
条形图(柱状图)用于对比不同类别的数值。涉及QBarSet、QBarSeries和坐标轴类QBarCategoryAxis、QValueAxis。
实现步骤:
- 创建QBarSet实例,用append()添加一组数据。
- 创建QBarSeries,将多个QBarSet添加进去。
- 创建QChart并添加Series,设置动画选项。
- 配置X轴(QBarCategoryAxis)添加类别标签,Y轴(QValueAxis)设置标题和范围。
- 通过attachAxis()将坐标轴与Series绑定。
完整代码:- 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)
- # 定义数据
- set1 = QBarSet("2023年")
- set2 = QBarSet("2024年")
- set1.append([10, 20, 30, 40])
- set2.append([15, 25, 35, 45])
- # 创建条形图系列
- series = QBarSeries()
- series.append(set1)
- series.append(set2)
- # 创建图表
- chart = QChart()
- chart.addSeries(series)
- chart.setTitle("季度销售额对比")
- chart.setAnimationOptions(QChart.AnimationOption.SeriesAnimations)
- # X轴(类别)
- categories = ["Q1", "Q2", "Q3", "Q4"]
- axis_x = QBarCategoryAxis()
- axis_x.append(categories)
- chart.addAxis(axis_x, Qt.AlignmentFlag.AlignBottom)
- series.attachAxis(axis_x)
- # Y轴(数值)
- axis_y = QValueAxis()
- axis_y.setTitleText("销售额 (万元)")
- chart.addAxis(axis_y, Qt.AlignmentFlag.AlignLeft)
- series.attachAxis(axis_y)
- chart.legend().setVisible(True)
- # 视图
- 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())
复制代码
## 3. 折线图(QLineSeries)
折线图展示数据随时间或有序类别变化的趋势,核心类QLineSeries。
实现步骤:
- 创建QLineSeries,使用append(x, y)添加数据点。
- 创建QChart,添加Series,设置标题和动画。
- 配置X轴和Y轴(此处均用QValueAxis),设置范围、标题,并绑定到Series。
完整代码:- 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)
- # 创建折线系列
- 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)
- # 创建图表
- chart = QChart()
- chart.addSeries(series)
- chart.setTitle("月度用户增长趋势")
- chart.setAnimationOptions(QChart.AnimationOption.SeriesAnimations)
- # X轴
- axis_x = QValueAxis()
- axis_x.setTitleText("月份")
- axis_x.setRange(0, 5)
- chart.addAxis(axis_x, Qt.AlignmentFlag.AlignBottom)
- series.attachAxis(axis_x)
- # Y轴
- 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)
- # 视图
- 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())
复制代码
## 关键要点总结
- 三层架构:所有图表统一遵循 Series → Chart → ChartView 的构建模式。
- 坐标轴绑定:条形图和折线图需手动创建坐标轴,并调用attachAxis()与Series关联。
- 抗锯齿:setRenderHint(QPainter.RenderHint.Antialiasing)可大幅提升图表边缘平滑度。
- 动画支持:通过setAnimationOptions()可添加系列动画或整体动画,提升用户体验。
掌握以上三种基础图表后,可进一步探索散点图、面积图、极坐标图等,PySide6的QtCharts还支持鼠标交互、缩放和自定义主题,适用于更复杂的数据可视化场景。 |