You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于PyQt5实现单画布5个动态图表的切换展示需求

基于PyQt5实现单画布多动态图表切换功能

以下是完整实现代码,包含5种不同的动态图表绘制方法,以及点击「下一个」按钮的切换逻辑:

import sys
import random
import numpy as np
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QPushButton
from PyQt5.QtCore import QTimer
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

class DynamicChartWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("动态图表切换")
        self.setGeometry(100, 100, 800, 600)

        # 初始化图表索引,0-4对应5个图表
        self.current_chart_idx = 0

        # 创建Matplotlib画布
        self.figure = Figure(figsize=(8, 6), dpi=100)
        self.canvas = FigureCanvas(self.figure)
        self.axes = self.figure.add_subplot(111)

        # 创建切换按钮
        self.next_btn = QPushButton("下一个")
        self.next_btn.clicked.connect(self.switch_chart)

        # 布局设置
        central_widget = QWidget()
        layout = QVBoxLayout(central_widget)
        layout.addWidget(self.canvas)
        layout.addWidget(self.next_btn)
        self.setCentralWidget(central_widget)

        # 定时器,每隔1秒更新图表数据
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update_current_chart)
        self.timer.start(1000)

        # 初始绘制第一个图表
        self.draw_chart1()

    def switch_chart(self):
        # 切换图表索引,循环切换
        self.current_chart_idx = (self.current_chart_idx + 1) % 5
        # 清除当前画布,绘制新图表
        self.axes.clear()
        if self.current_chart_idx == 0:
            self.draw_chart1()
        elif self.current_chart_idx == 1:
            self.draw_chart2()
        elif self.current_chart_idx == 2:
            self.draw_chart3()
        elif self.current_chart_idx == 3:
            self.draw_chart4()
        elif self.current_chart_idx == 4:
            self.draw_chart5()
        self.canvas.draw()

    def update_current_chart(self):
        # 更新当前显示的图表
        self.axes.clear()
        if self.current_chart_idx == 0:
            self.draw_chart1()
        elif self.current_chart_idx == 1:
            self.draw_chart2()
        elif self.current_chart_idx == 2:
            self.draw_chart3()
        elif self.current_chart_idx == 3:
            self.draw_chart4()
        elif self.current_chart_idx == 4:
            self.draw_chart5()
        self.canvas.draw()

    # 图表1:动态折线图(随机波动数据)
    def draw_chart1(self):
        x = np.arange(0, 10, 0.1)
        y = np.sin(x) + random.uniform(-0.3, 0.3)
        self.axes.plot(x, y, color='blue')
        self.axes.set_title("动态折线图")
        self.axes.set_xlabel("X轴")
        self.axes.set_ylabel("Y轴")

    # 图表2:动态柱状图(随机高度)
    def draw_chart2(self):
        x = ['A', 'B', 'C', 'D', 'E']
        y = [random.randint(1, 10) for _ in range(5)]
        self.axes.bar(x, y, color='green')
        self.axes.set_title("动态柱状图")
        self.axes.set_xlabel("类别")
        self.axes.set_ylabel("数值")

    # 图表3:动态饼图(随机占比)
    def draw_chart3(self):
        sizes = [random.randint(10, 30) for _ in range(4)]
        labels = ['组1', '组2', '组3', '组4']
        self.axes.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)
        self.axes.set_title("动态饼图")
        self.axes.axis('equal')  # 保证饼图是圆形

    # 图表4:动态散点图(随机坐标点)
    def draw_chart4(self):
        x = [random.uniform(0, 10) for _ in range(50)]
        y = [random.uniform(0, 10) for _ in range(50)]
        sizes = [random.randint(20, 100) for _ in range(50)]
        colors = [random.random() for _ in range(50)]
        self.axes.scatter(x, y, s=sizes, c=colors, alpha=0.5)
        self.axes.set_title("动态散点图")
        self.axes.set_xlabel("X坐标")
        self.axes.set_ylabel("Y坐标")

    # 图表5:动态面积图(随机填充区域)
    def draw_chart5(self):
        x = np.arange(0, 10, 0.1)
        y1 = np.sin(x) + random.uniform(-0.2, 0.2)
        y2 = np.cos(x) + random.uniform(-0.2, 0.2)
        self.axes.fill_between(x, y1, y2, color='orange', alpha=0.3)
        self.axes.plot(x, y1, color='red', label='曲线1')
        self.axes.plot(x, y2, color='purple', label='曲线2')
        self.axes.set_title("动态面积图")
        self.axes.set_xlabel("X轴")
        self.axes.set_ylabel("Y轴")
        self.axes.legend()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = DynamicChartWindow()
    window.show()
    sys.exit(app.exec_())

关键实现说明

  • 图表切换逻辑:通过current_chart_idx维护当前显示的图表序号,点击按钮时循环更新序号,清除画布后调用对应图表的绘制方法。
  • 动态更新:使用QTimer定时触发图表重绘,每次重绘都会生成新的随机数据,实现动态效果。
  • 画布管理:每次绘制前调用axes.clear()清除原有内容,避免图表重叠;调用canvas.draw()刷新画布显示。
  • 5种图表类型:分别实现了折线图、柱状图、饼图、散点图、面积图,每种图表都有独立的绘制逻辑和动态数据生成方式。

内容的提问来源于stack exchange,提问作者Varsha Hegde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 17:13:25