用pyqt5+matplotlib实现简易拟合曲线功能

【前言】

这个是照猫画老虎写的,自己python水平半吊子,还有图形化界面也是半吊子

主要是给自己做个笔记用的

【需要的工具】

Pycharm + miniconda(或者Aconda)

包: numpy(矩阵),matplotlib(绘图), scipy(拟合曲线), pyqt5(图形化界面)

【matplotlib绘图要素】 

 坐标轴(axis)、坐标轴名称(axis label)、坐标轴刻度(tick)、坐标轴刻度标签(tick label)、网格线(grid)、图例(legend)、标题(title)......

figure是大画板

Axes是子图,一个画板上可以有几个子图(或者叫一套坐标轴)

Axis是坐标轴,x轴或者y轴

Subplot可以将画布分为几个板块(参数111就是单独一块 一行一列)

matplotlib绘图:figure和axes有什么区别? - 种树人 - 博客园 (cnblogs.com)

【PyQt5】

 1.把pyqt的designer 和转化文件的UIC整合到pycharm中,参考:

(18条消息) PyCharm+PyQt5+QtDesigner配置_路在脚下,更在心中-CSDN博客_pycharm qtdesigner

2.设计图形化界面: 在pycharm的tool处选择导入的工具designer,进行图形化界面设计

 3.保存后在pycharm中看到有个.ui的文件,使用刚刚导入的UIC工具转化为.py文件

【功能代码】

1.把设计ui的那个文件作为一个头文件,导入到main.py中

from my_graph import Ui_MainWindow
#这里是从my_graph.py中只导入那个Ui类的意思

2.写一个画图类,在内部实例化一个Ui类(相当于实例化一个图形化界面),然后在这个画图类里面书写槽函数即可

3.书写槽函数,接收npy文件(numpy文件),进行数字处理

4.在设计的区域建立画板,设置画布;图像拟合;绘图即可

【效果】

 

【.ui转.py代码】

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'my_graph.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(957, 531)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(520, 10, 91, 71))
        font = QtGui.QFont()
        font.setFamily("黑体")
        font.setPointSize(20)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(520, 70, 91, 71))
        font = QtGui.QFont()
        font.setFamily("黑体")
        font.setPointSize(20)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.x_input = QtWidgets.QTextEdit(self.centralwidget)
        self.x_input.setGeometry(QtCore.QRect(620, 30, 191, 31))
        self.x_input.setObjectName("x_input")
        self.y_input = QtWidgets.QTextEdit(self.centralwidget)
        self.y_input.setGeometry(QtCore.QRect(620, 100, 191, 31))
        self.y_input.setObjectName("y_input")
        self.toolButton_x = QtWidgets.QToolButton(self.centralwidget)
        self.toolButton_x.setGeometry(QtCore.QRect(820, 30, 61, 31))
        self.toolButton_x.setObjectName("toolButton_x")
        self.toolButton_2 = QtWidgets.QToolButton(self.centralwidget)
        self.toolButton_2.setGeometry(QtCore.QRect(820, 100, 61, 31))
        self.toolButton_2.setObjectName("toolButton_2")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(540, 220, 111, 61))
        font = QtGui.QFont()
        font.setFamily("黑体")
        font.setPointSize(20)
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")
        self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit_3.setGeometry(QtCore.QRect(620, 230, 191, 41))
        self.textEdit_3.setObjectName("textEdit_3")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(510, 320, 151, 51))
        font = QtGui.QFont()
        font.setFamily("黑体")
        font.setPointSize(20)
        self.label_4.setFont(font)
        self.label_4.setObjectName("label_4")
        self.comboBox = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox.setGeometry(QtCore.QRect(670, 320, 141, 51))
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(610, 420, 181, 61))
        font = QtGui.QFont()
        font.setFamily("黑体")
        font.setPointSize(20)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 10, 471, 511))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        MainWindow.setCentralWidget(self.centralwidget)

        #用来显示各种字体
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "绘图器by华重楼"))
        self.label.setText(_translate("MainWindow", "x_row"))
        self.label_2.setText(_translate("MainWindow", "y_row"))
        self.toolButton_x.setText(_translate("MainWindow", "..."))
        self.toolButton_2.setText(_translate("MainWindow", "..."))
        self.label_3.setText(_translate("MainWindow", "点数"))
        self.label_4.setText(_translate("MainWindow", "拟合类型"))
        self.comboBox.setItemText(0, _translate("MainWindow", "line"))
        self.comboBox.setItemText(1, _translate("MainWindow", "two"))
        self.pushButton.setText(_translate("MainWindow", "一键拟合"))

【main.py代码】

import sys
from my_graph import Ui_MainWindow
#只导入my_graph文件里的ui类

from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt
import numpy as np
from scipy import interpolate

#创造一个画图类  里面实例化一个ui类
#继承于 ?
class plot_window(QMainWindow):
    def __init__(self):
        super(plot_window, self).__init__()
        #实例化一个ui类  变量名就叫ui
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        #实例化了一个ui类  因此使用ui类的东西 要.
        self.ui.toolButton_x.clicked.connect(self.plot_x_input)
        self.ui.toolButton_2.clicked.connect(self.plot_y_input)
        self.ui.pushButton .clicked.connect(self.plot_main)

        self.x_raw = np.array([])
        self.y_raw = np.array([])
        self.x_new = np.array([])
        self.y_new = np.array([])

        #建立画布作为verticalLayout的一个新窗口
        self.figure = plt.figure() #创建画板
        self.canvas = FigureCanvas(self.figure) #创建画布
        self.ui.verticalLayout.addWidget(self.canvas) #添加画布到窗口

    #导入x,y数据的槽函数
    def plot_x_input(self):
        selected_file, _ = QFileDialog.getOpenFileName(self, 'Select Numpy data file ...', '', "Numpy Files(*.npy)")
        #选择一个numpy文件进行导入
        self.ui.x_input.setText(selected_file)
        self.x_raw = np.load(selected_file )  # 把x输入文本储存

    def plot_y_input(self):
        selected_file, _ = QFileDialog.getOpenFileName(self, 'Select Numpy data file ...', '', "Numpy Files(*.npy)")
        self.ui.y_input.setText(selected_file)  #设置读入的数据放入文本框内
        self.y_raw = np.load(selected_file )   #数据放入y_raw保存

    #绘图的槽函数
    def plot_main(self):


        num_of_point=int(self.ui.textEdit_3.toPlainText() )   #读取x输入行的文本信息
        #单行文本用text()获取  多行文本用toPlainText()获取
        self.x_new = np.linspace(self.x_raw[0], self.x_raw[-1], num_of_point)   #返回一个列表

        way=self.ui.comboBox .currentText()

        if way=='line':
            inter=interpolate.interp1d(self.x_raw, self.y_raw, kind='linear')
        elif way=='two':
            inter=interpolate.interp1d(self.x_raw, self.y_raw, kind='cubic')

        self.y_new = inter(self.x_new)  #进行y对x的拟合

        self.figure.clear() #清空画板

        sub_graph=self.figure.add_subplot(111)
        # 在figure添加一个子图(画布) 其中参数111,指的是将图像分成1行1列,此子图占据从左到右从上到下的1位置。

        sub_graph.plot(self.x_new ,self.y_new ,'*-',linewidth=0.6)
        #添加曲线

        sub_graph.set_xlabel('x', fontsize=11)
        sub_graph.set_ylabel('Y(x)', fontsize=11)
        #设置x,y轴的标签

        self.canvas.draw()
        #绘制图像

app = QApplication([])
win = plot_window()
win.show()
sys.exit(app.exec())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值