PySide6 数据可视化实战:饼图、条形图与折线图绘制指南

1. 引言

PySide6 是 Qt 官方的 Python 绑定库,不仅提供了强大的 GUI 开发能力,还内置了 QtCharts 模块,能够以原生渲染的方式绘制高质量的统计图表。相比于 Matplotlib 等第三方库,PySide6 的图表在交互性、主题适配以及嵌入桌面应用时的性能表现上更具优势。

本教程将详细介绍如何使用 PySide6 制作三种最常用的统计图表:饼图、条形图和折线图。每个案例均包含完整的可运行代码,帮助你快速掌握核心 API 的使用。

环境准备:请确保已安装 PySide6。


2. 饼图的制作方法及完整代码案例

饼图适用于展示各部分在整体中的占比情况。在 PySide6 中,核心类为 QPieSeriesQPieSlice

核心步骤

  1. 创建 QPieSeries 对象。
  2. 使用 append() 方法添加标签和数值。
  3. 创建 QChart 并将 Series 添加进去。
  4. 使用 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 提供 QBarSeriesQBarSetQBarCategoryAxis 来实现。

核心步骤

  1. 创建 QBarSet 定义数据系列。
  2. 创建 QBarSeries 并添加 Set。
  3. 配置 X 轴(类别轴)和 Y 轴(数值轴)。
  4. 将 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

核心步骤

  1. 创建 QLineSeries 并使用 append(x, y) 添加数据点。
  2. 创建 QChart 并添加 Series。
  3. 配置坐标轴(通常 X 轴为类别或时间,Y 轴为数值)。
  4. 使用 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 展示数据随时间/顺序的变化趋势

关键要点回顾

  1. 统一架构 :所有图表都遵循 Series → Chart → ChartView 的三层结构。
  2. 坐标轴绑定 :条形图和折线图需要手动创建坐标轴并通过 attachAxis() 与 Series 关联。
  3. 抗锯齿 :务必调用 setRenderHint(QPainter.RenderHint.Antialiasing) 以获得平滑的渲染效果。
  4. 动画支持 :通过 setAnimationOptions() 可以为图表添加生动的过渡动画。

PySide6 的图表模块还支持散点图、面积图、极坐标图等多种类型,且支持鼠标交互、缩放和自定义主题。掌握以上三种基础图表后,你可以轻松扩展到更复杂的数据可视化场景。