当前位置: 首页 > article >正文

【PyQt】使用PyQt5和Matplotlib实现的CSV数据可视化工具

使用PyQt5和Matplotlib实现的CSV数据可视化工具

界面展示

在这里插入图片描述

代码

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,
                             QHBoxLayout, QPushButton, QComboBox, QFileDialog,
                             QLabel, QMessageBox)
import pandas as pd
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar

class CSVVisualizer(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.df = None  # 用于存储CSV数据

    def initUI(self):
        self.setWindowTitle('CSV数据可视化工具')
        self.setGeometry(100, 100, 1024, 768)

        # 创建中心部件和主布局
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        main_layout = QVBoxLayout(central_widget)

        # 创建菜单栏
        menubar = self.menuBar()
        file_menu = menubar.addMenu('文件')
        open_action = file_menu.addAction('打开CSV')
        open_action.triggered.connect(self.load_csv)

        # 创建控件容器
        controls = QWidget()
        control_layout = QHBoxLayout(controls)
        
        # 添加控件
        control_layout.addWidget(QLabel("X轴:"))
        self.x_combo = QComboBox()
        control_layout.addWidget(self.x_combo)
        
        control_layout.addWidget(QLabel("Y轴:"))
        self.y_combo = QComboBox()
        control_layout.addWidget(self.y_combo)
        
        self.plot_btn = QPushButton("绘制图表")
        self.plot_btn.clicked.connect(self.plot_chart)
        control_layout.addWidget(self.plot_btn)

        # 添加Matplotlib组件
        self.figure = Figure()
        self.canvas = FigureCanvas(self.figure)
        self.toolbar = NavigationToolbar(self.canvas, self)

        # 将组件添加到主布局
        main_layout.addWidget(controls)
        main_layout.addWidget(self.toolbar)
        main_layout.addWidget(self.canvas)

    def load_csv(self):
        """加载CSV文件"""
        path, _ = QFileDialog.getOpenFileName(
            self, '打开CSV文件', '', 'CSV文件 (*.csv)')
        
        if path:
            try:
                self.df = pd.read_csv(path)
                columns = self.df.columns.tolist()
                
                # 更新下拉菜单
                self.x_combo.clear()
                self.y_combo.clear()
                self.x_combo.addItems(columns)
                self.y_combo.addItems(columns)
                
            except Exception as e:
                QMessageBox.critical(self, '错误', f'文件读取失败: {str(e)}')

    def plot_chart(self):
        """绘制图表"""
        if self.df is None:
            QMessageBox.warning(self, '警告', '请先加载CSV文件')
            return
        
        x_col = self.x_combo.currentText()
        y_col = self.y_combo.currentText()
        
        if not x_col or not y_col:
            QMessageBox.warning(self, '警告', '请选择X/Y轴列')
            return
        
        try:
            # 清除旧图表
            self.figure.clear()
            ax = self.figure.add_subplot(111)
            
            # 绘制散点图
            ax.scatter(self.df[x_col], self.df[y_col], alpha=0.6)
            ax.set_xlabel(x_col)
            ax.set_ylabel(y_col)
            ax.set_title(f'{x_col} vs {y_col}')
            
            # 自动调整布局并刷新
            self.figure.tight_layout()
            self.canvas.draw()
            
        except Exception as e:
            QMessageBox.critical(self, '错误', f'绘图失败: {str(e)}')

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

功能说明:

界面布局:
  • 顶部菜单栏提供文件打开功能

  • 中部控制面板包含列选择下拉框和绘图按钮

  • 底部显示Matplotlib图表及导航工具栏

主要功能:
  • 支持打开CSV文件并自动检测列名

  • 提供X/Y轴列选择

  • 绘制散点图并支持工具栏交互(缩放、平移等)

  • 基本的错误处理机制

使用说明:
  • 点击"文件"->"打开CSV"选择数据文件

  • 从下拉菜单选择需要绘制的X/Y轴列

  • 点击"绘制图表"生成可视化图形

  • 使用下方工具栏进行图表操作


http://www.kler.cn/a/533615.html

相关文章:

  • DeepSeek R1技术报告关键解析(6/10):DeepSeek-R1 vs. OpenAI-o1-1217:性能对比分析
  • 修剪二叉搜索树(力扣669)
  • C#面试常考随笔12:游戏开发中常用的设计模式【C#面试题(中级篇)补充】
  • 基于微信小程序的校园水电费管理平台设计与实现
  • MYSQL面试题总结(题目来源JavaGuide)
  • 86.(2)攻防世界 WEB PHP2
  • 【React】受控组件和非受控组件
  • 在线教程丨YOLO系列10年更新11个版本,最新模型在目标检测多项任务中达SOTA
  • 逻辑回归原理
  • [数据结构] 线性表和顺序表
  • Elasticsearch面试技巧:从基础到高级
  • 血压计OCR文字检测数据集VOC+YOLO格式2147张11类别
  • 最短木板长度
  • 初识 Node.js
  • 扣子平台的选择器节点:让智能体开发更简单,扣子免费系列教程(17)
  • C++ Primer 算术运算符
  • DEA-Net(2024 SCI 1区)
  • 掌握@PostConstruct与@PreDestroy,优化Spring Bean的初始化和销毁
  • 【玩转 Postman 接口测试与开发2_017】第13章:在 Postman 中实现契约测试(Contract Testing)与 API 接口验证(下)
  • java Fx进阶操作
  • Micropython RPI-PICO 随记-LVGL实战1
  • Java基础面试题50题
  • Java 如何覆盖第三方 jar 包中的类
  • mysql学习笔记-MySql事务日志
  • HarmonyOS NEXT:应用程序框架进阶
  • Android Studio:Application 和 Activity的区别