查看: 122|回复: 3

PySide6 QtCharts实战:绘制饼图、条形图、折线图(附代码)

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
在桌面应用开发中,数据可视化是常见需求。PySide6作为Qt官方的Python绑定,内置了QtCharts模块,相比Matplotlib等第三方库,其图表能原生嵌入GUI窗口,支持交互、主题适配和性能优化。本文通过三个完整示例,演示如何使用PySide6的QtCharts模块制作饼图、条形图和折线图。

环境要求:已安装PySide6(pip install pyside6)。

## 1. 饼图(QPieSeries)

饼图适合展示各部分占整体的比例。核心类为QPieSeries和QPieSlice。

实现步骤:
- 创建QPieSeries对象,使用append()添加标签和数值。
- 可通过slices()获取切片对象,设置突出显示(setExploded)和标签可见(setLabelVisible)。
- 创建QChart并添加Series,设置标题和图例。
- 使用QChartView展示图表,开启抗锯齿渲染。

完整代码:
  1. import sys
  2. from PySide6.QtWidgets import QApplication, QMainWindow
  3. from PySide6.QtCharts import QChart, QChartView, QPieSeries
  4. from PySide6.QtGui import QPainter
  5. class PieChartWindow(QMainWindow):
  6.     def __init__(self):
  7.         super().__init__()
  8.         self.setWindowTitle("PySide6 饼图示例")
  9.         self.resize(600, 400)
  10.         # 创建饼图系列
  11.         series = QPieSeries()
  12.         series.append("Python", 45)
  13.         series.append("C++", 25)
  14.         series.append("JavaScript", 20)
  15.         series.append("Go", 10)
  16.         # 突出显示第一块并显示标签
  17.         slice_obj = series.slices()[0]
  18.         slice_obj.setExploded()
  19.         slice_obj.setLabelVisible(True)
  20.         # 创建图表
  21.         chart = QChart()
  22.         chart.addSeries(series)
  23.         chart.setTitle("编程语言使用占比")
  24.         chart.legend().setVisible(True)
  25.         # 创建视图
  26.         chart_view = QChartView(chart)
  27.         chart_view.setRenderHint(QPainter.RenderHint.Antialiasing)
  28.         self.setCentralWidget(chart_view)
  29. if __name__ == "__main__":
  30.     app = QApplication(sys.argv)
  31.     window = PieChartWindow()
  32.     window.show()
  33.     sys.exit(app.exec())
复制代码

## 2. 条形图(QBarSeries)

条形图(柱状图)用于对比不同类别的数值。涉及QBarSet、QBarSeries和坐标轴类QBarCategoryAxis、QValueAxis。

实现步骤:
- 创建QBarSet实例,用append()添加一组数据。
- 创建QBarSeries,将多个QBarSet添加进去。
- 创建QChart并添加Series,设置动画选项。
- 配置X轴(QBarCategoryAxis)添加类别标签,Y轴(QValueAxis)设置标题和范围。
- 通过attachAxis()将坐标轴与Series绑定。

完整代码:
  1. import sys
  2. from PySide6.QtWidgets import QApplication, QMainWindow
  3. from PySide6.QtCharts import (
  4.     QChart, QChartView, QBarSeries, QBarSet,
  5.     QBarCategoryAxis, QValueAxis
  6. )
  7. from PySide6.QtGui import QPainter, Qt
  8. class BarChartWindow(QMainWindow):
  9.     def __init__(self):
  10.         super().__init__()
  11.         self.setWindowTitle("PySide6 条形图示例")
  12.         self.resize(700, 450)
  13.         # 定义数据
  14.         set1 = QBarSet("2023年")
  15.         set2 = QBarSet("2024年")
  16.         set1.append([10, 20, 30, 40])
  17.         set2.append([15, 25, 35, 45])
  18.         # 创建条形图系列
  19.         series = QBarSeries()
  20.         series.append(set1)
  21.         series.append(set2)
  22.         # 创建图表
  23.         chart = QChart()
  24.         chart.addSeries(series)
  25.         chart.setTitle("季度销售额对比")
  26.         chart.setAnimationOptions(QChart.AnimationOption.SeriesAnimations)
  27.         # X轴(类别)
  28.         categories = ["Q1", "Q2", "Q3", "Q4"]
  29.         axis_x = QBarCategoryAxis()
  30.         axis_x.append(categories)
  31.         chart.addAxis(axis_x, Qt.AlignmentFlag.AlignBottom)
  32.         series.attachAxis(axis_x)
  33.         # Y轴(数值)
  34.         axis_y = QValueAxis()
  35.         axis_y.setTitleText("销售额 (万元)")
  36.         chart.addAxis(axis_y, Qt.AlignmentFlag.AlignLeft)
  37.         series.attachAxis(axis_y)
  38.         chart.legend().setVisible(True)
  39.         # 视图
  40.         chart_view = QChartView(chart)
  41.         chart_view.setRenderHint(QPainter.RenderHint.Antialiasing)
  42.         self.setCentralWidget(chart_view)
  43. if __name__ == "__main__":
  44.     app = QApplication(sys.argv)
  45.     window = BarChartWindow()
  46.     window.show()
  47.     sys.exit(app.exec())
复制代码

## 3. 折线图(QLineSeries)

折线图展示数据随时间或有序类别变化的趋势,核心类QLineSeries。

实现步骤:
- 创建QLineSeries,使用append(x, y)添加数据点。
- 创建QChart,添加Series,设置标题和动画。
- 配置X轴和Y轴(此处均用QValueAxis),设置范围、标题,并绑定到Series。

完整代码:
  1. import sys
  2. from PySide6.QtWidgets import QApplication, QMainWindow
  3. from PySide6.QtCharts import QChart, QChartView, QLineSeries, QValueAxis
  4. from PySide6.QtGui import QPainter
  5. from PySide6.QtCore import Qt
  6. class LineChartWindow(QMainWindow):
  7.     def __init__(self):
  8.         super().__init__()
  9.         self.setWindowTitle("PySide6 折线图示例")
  10.         self.resize(700, 450)
  11.         # 创建折线系列
  12.         series = QLineSeries()
  13.         series.setName("用户增长")
  14.         series.append(0, 100)
  15.         series.append(1, 150)
  16.         series.append(2, 180)
  17.         series.append(3, 250)
  18.         series.append(4, 320)
  19.         series.append(5, 400)
  20.         # 创建图表
  21.         chart = QChart()
  22.         chart.addSeries(series)
  23.         chart.setTitle("月度用户增长趋势")
  24.         chart.setAnimationOptions(QChart.AnimationOption.SeriesAnimations)
  25.         # X轴
  26.         axis_x = QValueAxis()
  27.         axis_x.setTitleText("月份")
  28.         axis_x.setRange(0, 5)
  29.         chart.addAxis(axis_x, Qt.AlignmentFlag.AlignBottom)
  30.         series.attachAxis(axis_x)
  31.         # Y轴
  32.         axis_y = QValueAxis()
  33.         axis_y.setTitleText("用户数")
  34.         axis_y.setRange(0, 500)
  35.         chart.addAxis(axis_y, Qt.AlignmentFlag.AlignLeft)
  36.         series.attachAxis(axis_y)
  37.         chart.legend().setVisible(True)
  38.         # 视图
  39.         chart_view = QChartView(chart)
  40.         chart_view.setRenderHint(QPainter.RenderHint.Antialiasing)
  41.         self.setCentralWidget(chart_view)
  42. if __name__ == "__main__":
  43.     app = QApplication(sys.argv)
  44.     window = LineChartWindow()
  45.     window.show()
  46.     sys.exit(app.exec())
复制代码

## 关键要点总结

- 三层架构:所有图表统一遵循 Series → Chart → ChartView 的构建模式。
- 坐标轴绑定:条形图和折线图需手动创建坐标轴,并调用attachAxis()与Series关联。
- 抗锯齿:setRenderHint(QPainter.RenderHint.Antialiasing)可大幅提升图表边缘平滑度。
- 动画支持:通过setAnimationOptions()可添加系列动画或整体动画,提升用户体验。

掌握以上三种基础图表后,可进一步探索散点图、面积图、极坐标图等,PySide6的QtCharts还支持鼠标交互、缩放和自定义主题,适用于更复杂的数据可视化场景。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: PySide6 QtCharts实战:绘制饼图、条形图、折线图(附代码)

感谢楼主分享!PySide6 QtCharts 的这三类图表示例非常实用,代码结构清晰,注释到位,对刚接触桌面端数据可视化的同学来说很友好。尤其是饼图里用 setExploded 突出显示某一块、条形图中绑定双坐标轴这些细节,都是实际开发中经常用到的技巧。方便的话,想请教一下折线图(QLineSeries)部分是不是后续会补充完整?另外,如果把图表放到 QMainWindow 的布局里,是否需要额外处理窗口缩放时的自适应?期待继续更新!
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: PySide6 QtCharts实战:绘制饼图、条形图、折线图(附代码)

感谢楼主分享这么实战的教程!代码结构清晰,注释也到位,对刚接触 PySide6 QtCharts 的人来说非常友好。饼图那块把突出显示和标签可视化的细节展示出来了,条形图里坐标轴绑定也写得很规范,直接就能跑起来。 自己之前一直用 Matplotlib 嵌入 GUI,总觉得交互和风格适配有点麻烦,看了你这个例子,QtCharts 原生嵌入确实更顺手,尤其动画和抗锯齿渲染省心不少。有个小问题想请教一下:折线图部分楼主计划后续再补吗?还是说类似柱状图的 QLineSeries 用法也建议自己摸索?另外,如果要在图表上叠加第二个数据系列(比如折线和柱状图混搭),QtCharts 支持多 series 叠加吗?期待后续更新!
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: PySide6 QtCharts实战:绘制饼图、条形图、折线图(附代码)

楼主分享的 PySide6 QtCharts 实战非常实用,代码结构清晰,注释也很到位,对刚接触桌面端数据可视化的同学帮助很大。饼图和条形图的示例都很典型,特别是突出显示切片和添加图例的部分,直接能用到真实项目里。不过我发现帖子最后的折线图示例好像只贴了一部分(到 chart.addAxi 就断了),是代码还没写完还是排版问题?如果方便的话希望能补完折线图的部分,这样三个完整示例就是一套入门好资料了。感谢楼主的贡献!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-30 11:51 , Processed in 0.030274 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部