def initUi(self): self.layout = QVBoxLayout(self) # 创建matplot画布 self.mpl = PlotCanvas(self, width=9, height=6, dpi=100) self.mpl2 = PlotCanvas(self, width=9, height=6, dpi=100) self.mpl3 = PlotCanvas(self, width=9, height=6, dpi=100) # mpl.draw_one_line() # 加载数据 # 在不同的画布上画出来 # 将所有f分页加入到tabWidget上 lines = load_all_lines() self.mpl.draw_one_line(lines[0]) self.mpl2.draw_one_line(lines[1]) self.mpl3.draw_one_line(lines[2]) self.stack.addTab(self.mpl, 'td=0.12') self.stack.addTab(self.mpl2, 'td=0.144') self.stack.addTab(self.mpl3, 'td=0.176') self.layout.addWidget(self.stack)
def draw_all_stack_tab(self): # 绘制所有图像 # 添加到stack_tabWidget上 # 创建matplot画布 self.tab1 = PlotCanvas(self, width=9, height=6, dpi=100) self.tab2 = PlotCanvas(self, width=9, height=6, dpi=100) self.tab3 = PlotCanvas(self, width=9, height=6, dpi=100) # mpl.draw_one_line() # 加载数据 # 在不同的画布上画出来 # 将所有f分页加入到tabWidget上 lines = load_all_lines() self.tab1.draw_one_line(lines[0]) self.tab2.draw_one_line(lines[1]) self.tab3.draw_one_line(lines[2]) # 将所有的tab添加到stack_tabWidget上 self.stack_tabWidget.addTab(self.tab1, 'td=0.12') self.stack_tabWidget.addTab(self.tab2, 'td=0.144') self.stack_tabWidget.addTab(self.tab3, 'td=0.176') pass
def zoom_pic(): # 绘制散点图 # 缩放图像 # figure = plt.figure() # 创建主图层 figure = plt.figure(figsize=(9, 6), dpi=100) # figure.suptitle('点击左子图 右边显示放大10倍的细节', fontsize=14, fontweight='bold') # 加载曲线数据 # x, c, s = load_date() # 创建两个子图 # 左子图 src = plt.subplot( 111) # 第一行的图 211 --> 类似(n,m,o) (n) 代表 主图分n两行 每行分成m列代表每行分成 # 记载所有曲线信息 lines = load_all_lines() # log("lines = ({})".format(lines)) # i是曲线的颜色参数 i = 0 for line in lines: title, rd, Td = line xarr = rd yarr = Td # log('rd = {}'.format(rd)) # 自动获取不同线条颜色 line_color = chose_color(i) i += 1 # 选择颜色, 绘制曲线 # 分别将曲线数据 加载到src图上 src.plot(xarr, yarr, color=line_color, linewidth=2.5, linestyle='-', label='Td=({})'.format(title)) # 增加了label以便增加图例 # 获取当前yarr拐点位置 t = find_inflection_point(yarr) # log('y的拐点({})'.format(t)) # 将拐点显示出来 xzb = xarr[t] yzb = yarr[t] src.plot(xzb, yzb, 'o') # 下面部分是是操作lenged标签位置 src.legend(loc='best') # 添加个图例 设置图例自动调整 # 根据所有拐点的数据 # 设置src缩放图的x轴上下限 和title xlim_min, xlim_max = get_zoomed_x_axes_limts() zoom_xlim = (xlim_min, xlim_max) # zoom_ylim = (ylim_min, ylim_max) src.set(xlim=zoom_xlim, autoscale_on=False, title='缩放图像') # 设置图例可拖动 leg = plt.legend() if leg: leg.draggable() # 显示图像 plt.show() pass
from PyQt5 import QtCore from PyQt5 import QtWidgets from PyQt5.QtWidgets import (QApplication, QMainWindow, QVBoxLayout, QSizePolicy, QAction, QLabel, QWidget, QStackedWidget, QPushButton, QTabWidget, QAction, QMessageBox, QFileDialog, QHBoxLayout) from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar import matplotlib.pyplot as plt from MatploWidget import PlotCanvas # qt绘制matplotlib图像的类 from mainFrom import Ui_MainWindow # 弹出为屏幕中心主窗口 from loadlines import load_all_lines # 加载数据 # 添加曲线到画布上 from PyQt5.QtWidgets import QDesktopWidget, QApplication, QMainWindow, QPushButton from utils import log # from MatploWidget import PlotCanvas fig = plt.figure() ax = fig.add_subplot(111) lines = load_all_lines() tab1 = PlotCanvas(width=9, height=6, dpi=100) tab1.draw_one_line(lines[0]) # fig.add_subplot(tab1) tab1.draw() # plt.show()
def get_zoomed_x_axes_limts(): # 接收所有曲线的信息 # 根据缩放函数 # 返回合适的x轴的上下限 # 缩放函数 # 1.寻找拐点 # 寻找拐点的位置 # 2.获取极值点附近的点数据 # 获取所以拐点的数据 # 拐点的y坐标决定 y轴上限 # 拐点的x坐标决定 x轴上限 # 获得点x, y的均值 # 根据均值设置图像的x轴 y轴 的上下限 lines = load_all_lines() # 所有曲线拐点所有x y数据 ext_xzbs = [] ext_yzbs = [] # 所有曲线第一个值 都是最大值 # 多根曲线将取最小的y作为缩放图的y上限 # 获取任意一根曲线的第一个点上的x作为最小值x first = [] # 找出曲线范围的最大最小值 for line in lines: title, td, rd = line xarr = td yarr = rd f = xarr[0] first.append(f) # 获取当前拐点位置 t = find_inflection_point(yarr) # 搜索y 点 左右某个 值小于某个数 # 极值点的y坐标决定 y轴上限 # 极值点的x坐标决定 x轴上限 xzb = xarr[t] yzb = yarr[t] ext_xzbs.append(xzb) ext_yzbs.append(yzb) # 获取任意一根曲线的第一个点上的最小的x # 作为最小值x first = np.array(first) xarr_min = first.min() # 所有拐点的x y数据 ext_xzbs = np.array(ext_xzbs) ext_yzbs = np.array(ext_yzbs) # 所有曲线拐点x的最大值 ext_x_min, ext_x_max = ext_xzbs.min(), ext_xzbs.max() # ext_y_min, ext_y_max = ext_yzbs.min(), ext_yzbs.max() # 调整曲线的边界 # ylim_min 根据xlim_max的最大的千分之一调整 dis = 0.03 ydis = 0.001 xlim_min = xarr_min - dis * ext_x_max xlim_max = ext_x_max # ylim_min = yarr_min - abs(xlim_max * ydis) # ylim_max = ext_y_min * y_multiples # ylim_max = first.max() return xlim_min, xlim_max pass