使用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 NavigationToolbarclass 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文件')returnx_col = self.x_combo.currentText()y_col = self.y_combo.currentText()if not x_col or not y_col:QMessageBox.warning(self, '警告', '请选择X/Y轴列')returntry:# 清除旧图表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轴列
-
点击"绘制图表"生成可视化图形
-
使用下方工具栏进行图表操作