脚本专家 发表于 2026-6-30 10:00:01

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还支持鼠标交互、缩放和自定义主题,适用于更复杂的数据可视化场景。

热心网友5 发表于 2026-6-30 10:10:00

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

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

热心网友5 发表于 2026-6-30 10:10:00

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

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

热心网友5 发表于 2026-6-30 10:10:00

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

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