【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轴列

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shanks66

你的鼓励是我创作的最大动力!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值