Example #1
0
def find_inflection_point(larr):
    # 传入曲线数组
    # 返回曲线拐点位置
    lines = load_all_lines()

    title, x, y = lines[0]

    # arr = y
    arr = larr
    ypow = 4
    y_disdance = 0.1**ypow
    # c = np.power(10, 9)

    # 0 -- len(arr-1) 的数据
    carr = arr[:-1]
    # 1 -- 98
    cparr = arr[1:]

    # 所有数据之间的距离
    distance = abs(carr - cparr)
    # cparr = arr[1:]
    # 寻找拐点 第一个点之间距离小于 0.1的 ypow(ypow=10)的点就是拐点
    #
    for i in range(len(distance)):
        dis = distance[i]
        if dis < y_disdance:
            log("i = ", i)
            return i
        pass
    log('lencparr', y_disdance)



    pass
    def initUi(self):
        self.layout = QVBoxLayout(self)

        # 创建matplot画布
        self.mpl = MyMplCanvas(self, width=9, height=6, dpi=100)
        self.mpl2 = MyMplCanvas(self, width=9, height=6, dpi=100)
        self.mpl3 = MyMplCanvas(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.mpl.start_static_plot() # 如果你想要初始化的时候就呈现静态图,请把这行注释去掉
        # self.mpl.start_dynamic_draw()

        # self.mpl.start_dynamic_plot() # 如果你想要初始化的时候就呈现动态图,请把这行注释去掉
        self.mpl_ntb = NavigationToolbar(self.mpl, self)  # 添加完整的 toolbar
        self.mpl2_ntb = NavigationToolbar(self.mpl2, self)  # 添加完整的 toolbar
        self.mpl3_ntb = NavigationToolbar(self.mpl3, self)  # 添加完整的 toolbar

        self.layout.addWidget(self.mpl_ntb)
        self.layout.addWidget(self.stack)
 def draw_all_line(self, all_lines):
     # lines = all_lines
     lines = load_all_lines()
     for i in range(len(lines)):
         line = lines[i]
         pic = self.draw_one_line(line)
         self.stack.addWidget(pic)
     pass
    def load_all_lines(self):
        # self.stack
        lines = load_all_lines()
        width = 9
        height = 6
        dpi = 100
        for i in range(len(lines)):
            fig = Figure(figsize=(width, height), dpi=dpi)
            # 添加数据到当前画布

        pass
Example #5
0
def draw_curve():
    # 从load_all_lines加载所有区县信息信息
    #  加载数据将数据绘制到matplotlib里面

    lines = load_all_lines()
    # log("draw_curve lines = ({})".format(lines))
    for line in lines:
        td, rd = line

        # log('td({}) rd({}) i'.format(td, rd))

    pass
    def start_static_plot(self):
        self.fig.suptitle('测试静态图')

        # t = arange(0.0, 3.0, 0.01)
        # s = sin(2 * pi * t)
        # 记载所有曲线信息
        lines = load_all_lines()
        # log("lines = ({})".format(lines))

        # i是曲线的颜色参数
        i = 0
        # title, rd, Td = lines[0]

        for line in lines:
            title, rd, Td = line
            xarr = rd
            yarr = Td

            line_color = chose_color(i)
            i += 1

            self.axes.plot(xarr, yarr, color=line_color, linewidth=2.5, linestyle='-',
                           label='Td=({})'.format(title))
            # # 获取当前yarr拐点位置
            t = find_inflection_point(yarr)
            # # log('y的拐点({})'.format(t))
            # # 将拐点显示出来
            xzb = xarr[t]
            yzb = yarr[t]
            self.axes.plot(xzb, yzb, 'o')

            # 下面部分是是操作lenged标签位置
            self.axes.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)
        self.axes.set(xlim=zoom_xlim)
        self.axes.set_ylabel('静态图:Y轴')
        self.axes.set_xlabel('静态图:X轴')
        self.axes.grid(True)

        # 设置图例可拖动
        leg = self.axes.legend()
        if leg:
            leg.draggable()
    def update_figure_one(self, page=0):
        from main import load_all_lines
        from main import chose_color
        from main import find_inflection_point
        from main import get_zoomed_x_axes_limts
        log = print
        # 这是模仿点击事件 传入不同的page
        lines = load_all_lines()
        # i = 1
        i = self.page

        self.page = i
        if i == len(lines) or i < 0:
            log("i=({})".format(i))
            i = 0
            return None
            # break
        line = lines[i]
        log("i=({})".format(i))

        self.drow_one_line(line)
        self.page += 1
Example #8
0
def draw_line(ratio=(0.1, 0.1), legend_position=(0.8, 0.9)):
    # 修正过的 正弦余弦图
    # ratio 是x轴 y轴偏移系数
    # legend_position为传入的lenged标签位置
    # 根据传入数据 自动调整x轴 y轴 边距大小
    # 加载数据
    # X, C, S = load_date()

    # 1. 获取曲线的数据 title, td, rd
    #      label图例 X Y = title, td, rd
    # 2.给不同曲线赋不同的颜色

    # 3.缩放

    # 创建一个8 * 6点(point)的图,并设置分辨率为80
    figure = plt.figure(figsize=(10,6), dpi=100)

    # 创建一个新的 1 * 1的子图,接下来的图样绘制在其中的第 1 块(也是唯一的一块)
    # figure.add_subplot(1, 1, 1)
    src = plt.subplot(211)  # 第一行的图
    zoom = plt.subplot(212)  # 第二行的图

    figure.add_axes(src, zoom)

    lines = load_all_lines()
    # log("draw_curve lines = ({})".format(lines))

    i = 0
    for line in lines:
        title, td, rd = line
        X = td
        Y = rd
        # log('rd = {}'.format(rd))

        # 自动获取不同线条颜色
        line_color = chose_color(i)
        # log('选中的颜色 = ', line_color)

        i += 1

        # 1.缩放曲线
        # 2.根据算法缩放曲线

        # 绘制曲线,使用不同颜色、连续的、宽度为 1 (像素)的线条
        # plt.plot(td, rd, color='brown',  linewidth=1.0, linestyle="-")

        # 以下 1, 2, 3 是自动调整图像的函数
        # 其实1, 2, 3 应该抽出一个设置边界的函数 暂时没看到matplotlib怎么操作画布对象 先写到这里

        # 数据用numpy加载之后
        # 1 这里获得 x 最大值最小值 y最大值最小值
        xmin, xmax = X.min(), X.max()
        ymin, ymax = Y.min(), Y.max()

        # 2 设置x,y 边界偏移程度
        # 亦可以将获得ratio 数据设置成一个函数get_border_ratio()
        rx, ry = ratio
        dx = (xmax - xmin) * rx
        dy = (ymax - ymin) * ry
        #
        # # 3 根据偏移程度 设置x轴 y轴的左右值
        # src.axes.set_xlim(xmin - dx, xmax + dx)
        # src.axes.set_ylim(ymin - dy, ymax + dy)



        # 加载曲线
        src.plot(X, Y, color=line_color, linewidth=2.5, linestyle='-', label='Td=({})'.format(title))  # 增加了label以便增加图例
        zoom.plot(X, Y, color=line_color, linewidth=2.5, linestyle='-', label='Td=({})'.format(title))  # 增加了label以便增加图例
        # plt.plot(X, S, color="red", linewidth=2.5, linestyle="-", label='sin')  # 增加了label以便增加图例

        # zoom.axes.set_xlim(0,100)
        # 下面部分是是操作lenged标签位置
        src.legend(loc='best')  # 添加个图例 设置图例自动调整
        zoom.legend(loc='best')

        figure.canvas.mpl_connect('button_press_event', onpress)

        # break
    # loc的值操纵图例的位置 取值在0 - 1之间  也可以取值为  'best'-->自动获取最好的结果  'upper left' -->左上   'upper right' -->右上等

    # draw_raw_sin_cos()

    # 在屏幕上显示

    plt.show()
Example #9
0
def zoom_pic():

    log("start zoom")
    # 绘制散点图
    # 缩放图像
    # figure = plt.figure()

    # 创建主图层
    figure = plt.figure(figsize=(9, 6), dpi=100)
    figure.suptitle('点击左子图 右边显示缩放', fontsize=14, fontweight='bold')
    # 加载曲线数据
    # x, c, s = load_date()

    # 创建两个子图
    # 左子图
    src = plt.subplot(121)  # 第一行的图 211 --> 类似(n,m,o) (n) 代表 主图分n两行 每行分成m列代表每行分成
    # 右子图
    zoom = plt.subplot(122)  # 第二行的图

    # 设置横轴的上下限
    # src.axes.set_xlim(-4.0, 4.0)
    # # 设置横轴坐标点
    # src.axes.set_ybound(-1, 1)

    # 子图加载曲线数据
    # src.scatter(x, y, s, c)
    # zoom.scatter(x, y, s, c)

    lines = load_all_lines()
    # log("draw_curve lines = ({})".format(lines))

    # 缩放数据
    # 1.斜率
    # 2.均值
    # 根据曲线数据 根据数据设置图像的 x,y轴
    # src.set(xlim=(0, 1), ylim=(0, 1), autoscale_on=False,
    #           title='Click to zoom')
    # zoom.set(xlim=(0.1, 0.55), ylim=(0.3, 0.6), autoscale_on=False,
    #            title='Zoom window')

    i = 0

    # 极值点所有x y数据
    ext_xzbs = []
    ext_yzbs = []
    # 曲线所有的x y数据
    xarrs = []
    yarrs = []

    for line in lines:
        title, td, rd = line
        xarr = td
        yarr = rd
        # log('rd = {}'.format(rd))

        # 获取当前曲线的xarr, yarr最大最小值
        xarr_max, xarr_min = xarr.max(), xarr.min()
        yarr_max, yarr_min = yarr.max(), yarr.min()



        # 自动获取不同线条颜色
        line_color = chose_color(i)

        # 1.缩放曲线
        # 2.根据算法缩放曲线

        # 选择颜色, 绘制曲线
        # 分别将曲线数据 加载到src, zoom 图上
        src.plot(xarr, yarr, color=line_color, linewidth=2.5, linestyle='-', label='Td=({})'.format(title))  # 增加了label以便增加图例
        zoom.plot(xarr, yarr, color=line_color, linewidth=2.5, linestyle='-', label='Td=({})'.format(title))  # 增加了label以便增加图例
        # plt.plot(X, S, color="red", linewidth=2.5, linestyle="-", label='sin')  # 增加了label以便增加图例
        i += 1

        # 获取当前曲线的xarr, yarr最大最小值
        xarr_max, xarr_min = xarr.max(), xarr.min()
        yarr_max, yarr_min = yarr.max(), yarr.min()

        # 缩放函数
        # 1.寻找极值点
        #       寻找极值点的位置
        # 2.获取极值点附近的点数据
        #       将极值点设置为图像中心点
        #       极值点左右分别取n(n=10)个点的数据
        #       获得点x, y的均值
        #       根据均值设置图像的x轴 y轴 的上下限

        # 获取当前yarr极值点
        t = find_inflection_point(yarr)
        # log('y的极值({})'.format(t))

        # 将该极值点在曲线上画出来
        # 极值点的y坐标决定 y轴上限
        # 极值点的x坐标决定 x轴上限
        xzb = xarr[t]
        yzb = yarr[t]
        zoom.plot(xzb, yzb, 'o')
        # log(' 坐标点x=({})  y=({})'.format(xzb, yzb))

        # 缩放多根曲线
        # 需要将曲线的 需要zoom_xlim zoom_ylim

        # 缩放单根曲线
        # 获取曲线极值点的当前坐标
        # 设置缩放的x轴

        # 根据当前曲线的xarr, yarr最大最小值 以及极值点缩放曲线

        # 设置缩放曲线的x, y轴的范围
        # zoom_xlim = get_zoomed_xy_axes_limts(xarr_min, xzb * 5)
        # zoom_ylim = get_zoomed_xy_axes_limts(yarr_min, yzb * 200)

        # 下面部分是是操作lenged标签位置
        # src.legend(loc='best')  # 添加个图例 设置图例自动调整
        zoom.legend(loc='best')

        src.set(title='原始图像')
        zoom.set(title='缩放图像')

        figure.canvas.mpl_connect('button_press_event', onpress)
        # break

    xlim_min, xlim_max, ylim_min, ylim_max = get_zoomed_xy_axes_limts()
    zoom_xlim = (xlim_min, xlim_max)
    zoom_ylim = (ylim_min, ylim_max)

    src.set(xlim=zoom_xlim, ylim=zoom_ylim, autoscale_on=False, title='原始缩放图像')
    zoom.set(xlim=zoom_xlim, ylim=zoom_ylim, autoscale_on=False, title='再次缩放图像')

    plt.show()
    log("end zoom")
    pass
Example #10
0
def get_zoomed_xy_axes_limts():
    # 接收所有曲线的信息
    # 返回合适的x, y轴的上下限
    # 曲线的x y的
    lines = load_all_lines()

    # 极值点所有x y数据
    ext_xzbs = []
    ext_yzbs = []

    # 曲线所有的x y数据
    xarrs = []
    yarrs = []

    # yarr[0]所对应的 y值是y的最小值

    #  所有曲线第一个值 都是最大值
    #  多根曲线将取最小的y作为缩放图的y上限
    first = []

    # 找出曲线范围的最大最小值
    for line in lines:
        title, td, rd = line
        xarr = td
        yarr = rd
        # log('rd = {}'.format(rd))

        f = yarr[0]
        first.append(f)

        xarrs.append(xarr)
        yarrs.append(yarr)

        # 获取当前yarr拐点
        t = find_inflection_point(yarr)
        # log('y的极值({})'.format(t))

        # 搜索y 点 左右某个 值小于某个数
        # yar =

        # 将该极值点在曲线上画出来
        # 极值点的y坐标决定 y轴上限
        # 极值点的x坐标决定 x轴上限
        xzb = xarr[t]
        yzb = yarr[t]
        ext_xzbs.append(xzb)
        ext_yzbs.append(yzb)

    # log('')
    np.array([])

    # 极值点所有x y数据
    ext_xzbs = np.array(ext_xzbs)
    ext_yzbs = np.array(ext_yzbs)

    # 曲线所有的x y数据
    xarrs = np.array(xarrs)
    yarrs = np.array(yarrs)

    first = np.array(first)

    y_max = first.min()
    # 获取当前所有曲线的xarr, yarr最大最小值
    xarr_max, xarr_min = xarrs.max(), xarrs.min()
    yarr_max, yarr_min = yarrs.max(), yarrs.min()

    ext_x_min, ext_x_max = ext_xzbs.min(), ext_xzbs.max()
    ext_y_min, ext_y_max = ext_yzbs.min(), ext_yzbs.max()

    xlim_min = xarr_min - 0.1 * xarr_min
    xlim_max = ext_x_max

    y_multiples = 100
    ylim_min = yarr_min - abs(yarr_min * 20)
    # ylim_max = ext_y_min * y_multiples
    ylim_max = yarr_min

    return xlim_min, xlim_max, ylim_min, y_max

        # 和本地的最大最小做比较
        #

        # 缩放函数
        # 1.寻找极值点
        #       寻找极值点的位置
        # 2.获取极值点附近的点数据
        #       将极值点设置为图像中心点
        #       极值点左右分别取n(n=10)个点的数据
        #       获得点x, y的均值
        #       根据均值设置图像的x轴 y轴 的上下限


        # src.plot(xzb, yzb, 'o')

    pass
Example #11
0
def zoom_pic():
    log("start zoom")
    # 绘制散点图
    # 缩放图像
    # 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(
        121)  # 第一行的图 211 --> 类似(n,m,o) (n) 代表 主图分n两行 每行分成m列代表每行分成
    # 右子图
    zoom = plt.subplot(122)  # 第二行的图

    # 设置横轴的上下限
    # src.axes.set_xlim(-4.0, 4.0)
    # # 设置横轴坐标点
    # src.axes.set_ybound(-1, 1)

    # 子图加载曲线数据
    # src.scatter(x, y, s, c)
    # zoom.scatter(x, y, s, c)

    lines = load_all_lines()
    # log("draw_curve lines = ({})".format(lines))

    # 缩放数据
    # 1.斜率
    # 2.均值
    # 根据曲线数据 根据数据设置图像的 x,y轴
    # src.set(xlim=(0, 1), ylim=(0, 1), autoscale_on=False,
    #           title='Click to zoom')
    # zoom.set(xlim=(0.1, 0.55), ylim=(0.3, 0.6), autoscale_on=False,
    #            title='Zoom window')

    i = 0

    # 极值点所有x y数据
    ext_xzbs = []
    ext_yzbs = []
    # 曲线所有的x y数据
    xarrs = []
    yarrs = []

    for line in lines:
        title, td, rd = line
        xarr = td
        yarr = rd

        # log('rd = {}'.format(rd))
        # 自动获取不同线条颜色
        line_color = chose_color(i)

        # 选择颜色, 绘制曲线
        # 分别将曲线数据 加载到src, zoom 图上

        # 抛弃多个曲线拐点之后的点
        # cut_extra_inflection_point()
        # xarr, yarr = cut_extra_inflection_point(xarr, yarr)
        src.plot(xarr,
                 yarr,
                 color=line_color,
                 linewidth=2.5,
                 linestyle='-',
                 label='Td=({})'.format(title))  # 增加了label以便增加图例
        zoom.plot(xarr,
                  yarr,
                  color=line_color,
                  linewidth=2.5,
                  linestyle='-',
                  label='Td=({})'.format(title))  # 增加了label以便增加图例
        # plt.plot(X, S, color="red", linewidth=2.5, linestyle="-", label='sin')  # 增加了label以便增加图例
        i += 1

        # 获取当前yarr拐点位置
        t = find_inflection_point(yarr)
        # log('y的拐点({})'.format(t))

        xzb = xarr[t]
        yzb = yarr[t]
        zoom.plot(xzb, yzb, 'o')

        # 缩放多根曲线
        # 需要将曲线的 需要zoom_xlim zoom_ylim

        # 缩放单根曲线
        # 获取曲线极值点的当前坐标
        # 设置缩放的x轴

        # 根据当前曲线的xarr, yarr最大最小值 以及极值点缩放曲线

        # 下面部分是是操作lenged标签位置
        src.legend(loc='best')  # 添加个图例 设置图例自动调整
        zoom.legend(loc='best')

        figure.canvas.mpl_connect('button_press_event', onpress)
        # break
    # 根据所有拐点的数据
    # 设置缩放图的上下限
    xlim_min, xlim_max, ylim_min, ylim_max = get_zoomed_xy_axes_limts()
    zoom_xlim = (xlim_min, xlim_max)
    zoom_ylim = (ylim_min, ylim_max)

    src.set(xlim=zoom_xlim, ylim=zoom_ylim, autoscale_on=False, title='原始缩放图像')
    zoom.set(xlim=zoom_xlim,
             ylim=zoom_ylim,
             autoscale_on=False,
             title='再次缩放图像')

    plt.show()
    log("end zoom")
    pass
Example #12
0
def get_zoomed_xy_axes_limts():
    # 接收所有曲线的信息
    # 根据缩放函数
    # 返回合适的x, y轴的上下限
    # 缩放函数
    # 1.寻找拐点
    #       寻找拐点的位置
    # 2.获取极值点附近的点数据
    #       获取所以拐点的数据
    #       拐点的y坐标决定 y轴上限
    #       拐点的x坐标决定 x轴上限
    #       获得点x, y的均值
    #       根据均值设置图像的x轴 y轴 的上下限

    lines = load_all_lines()

    # 极值点所有x y数据
    ext_xzbs = []
    ext_yzbs = []

    # 曲线所有的x y数据
    xarrs = []
    yarrs = []

    #  所有曲线第一个值 都是最大值
    #  多根曲线将取最小的y作为缩放图的y上限
    first = []

    # 找出曲线范围的最大最小值
    for line in lines:
        title, td, rd = line
        xarr = td
        yarr = rd

        # log('rd = {}'.format(rd))
        # f所对应的 当前曲线y的最大值
        # first获取所有y的最小的值
        # 设置为图像的y轴上限
        f = yarr[0]
        first.append(f)

        # 获取当前拐点位置
        t = find_inflection_point(yarr)

        # 去掉拐点之后的点
        # xarr = xarr[:t]
        # yarr = yarr[:t]

        xarrs.append(xarr)
        yarrs.append(yarr)

        # 搜索y 点 左右某个 值小于某个数
        # 极值点的y坐标决定 y轴上限
        # 极值点的x坐标决定 x轴上限
        xzb = xarr[t]
        yzb = yarr[t]
        ext_xzbs.append(xzb)
        ext_yzbs.append(yzb)

    # log('')
    np.array([])

    # 所有拐点的x y数据
    ext_xzbs = np.array(ext_xzbs)
    ext_yzbs = np.array(ext_yzbs)

    # 曲线所有的数据
    xarrs = np.array(xarrs)
    yarrs = np.array(yarrs)

    first = np.array(first)

    y_max = first.min()
    # 获取当前所有曲线的xarr, yarr最大最小值
    xarr_max, xarr_min = xarrs.max(), xarrs.min()
    yarr_max, yarr_min = yarrs.max(), yarrs.min()

    ext_x_min, ext_x_max = ext_xzbs.min(), ext_xzbs.max()
    ext_y_min, ext_y_max = ext_yzbs.min(), ext_yzbs.max()

    # 调整曲线的边界
    dis = 0.03
    ydis = 0.0001

    xlim_min = xarr_min - dis * ext_x_max
    xlim_max = ext_x_max

    ylim_min = yarr_min - abs(ext_x_max * ydis)
    # ylim_max = ext_y_min * y_multiples
    ylim_max = yarr_min

    return xlim_min, xlim_max, ylim_min, y_max
    pass
    def load_all_lines(self):
        # self.stack
        # 加载所有的曲线数据
        lines = load_all_lines()

        return lines