PySide6 QtCharts实战:绘制饼图、条形图、折线图(附代码)
在桌面应用开发中,数据可视化是常见需求。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()
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()
set2.append()
# 创建条形图系列
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还支持鼠标交互、缩放和自定义主题,适用于更复杂的数据可视化场景。
Re: PySide6 QtCharts实战:绘制饼图、条形图、折线图(附代码)
感谢楼主分享!PySide6 QtCharts 的这三类图表示例非常实用,代码结构清晰,注释到位,对刚接触桌面端数据可视化的同学来说很友好。尤其是饼图里用 setExploded 突出显示某一块、条形图中绑定双坐标轴这些细节,都是实际开发中经常用到的技巧。方便的话,想请教一下折线图(QLineSeries)部分是不是后续会补充完整?另外,如果把图表放到 QMainWindow 的布局里,是否需要额外处理窗口缩放时的自适应?期待继续更新!Re: PySide6 QtCharts实战:绘制饼图、条形图、折线图(附代码)
感谢楼主分享这么实战的教程!代码结构清晰,注释也到位,对刚接触 PySide6 QtCharts 的人来说非常友好。饼图那块把突出显示和标签可视化的细节展示出来了,条形图里坐标轴绑定也写得很规范,直接就能跑起来。 自己之前一直用 Matplotlib 嵌入 GUI,总觉得交互和风格适配有点麻烦,看了你这个例子,QtCharts 原生嵌入确实更顺手,尤其动画和抗锯齿渲染省心不少。有个小问题想请教一下:折线图部分楼主计划后续再补吗?还是说类似柱状图的 QLineSeries 用法也建议自己摸索?另外,如果要在图表上叠加第二个数据系列(比如折线和柱状图混搭),QtCharts 支持多 series 叠加吗?期待后续更新!Re: PySide6 QtCharts实战:绘制饼图、条形图、折线图(附代码)
楼主分享的 PySide6 QtCharts 实战非常实用,代码结构清晰,注释也很到位,对刚接触桌面端数据可视化的同学帮助很大。饼图和条形图的示例都很典型,特别是突出显示切片和添加图例的部分,直接能用到真实项目里。不过我发现帖子最后的折线图示例好像只贴了一部分(到 chart.addAxi 就断了),是代码还没写完还是排版问题?如果方便的话希望能补完折线图的部分,这样三个完整示例就是一套入门好资料了。感谢楼主的贡献!
页:
[1]