基于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
相关产品推荐
相关产品推荐

