【前言】
这个是照猫画老虎写的,自己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())