示例#1
0
def line_graph(data,
               x,
               lbl=None,
               file_name="",
               x_label="",
               y_label="",
               title="",
               marker=None):
    # TODO: Добавить документацию
    graph = Graph()
    graph.set_params()
    settings = Settings()
    markers = [
        'o', 'x', 'v', '^', '<', '>', 's', 'p', '*', 'h', 'H', '+', 'D', 'd',
        '|', '_'
    ]

    graph.set_labels(xlabel=x_label,
                     ylabel=y_label,
                     title=title,
                     legend_title="")

    if len(data) > len(markers):
        markers_list = markers.append(markers[:(len(data) - len(markers))])
    else:
        markers_list = markers
    markers_idx = generate_rand_int_list(len(data))
    data = np.array(data)
    if len(data.shape) == 1:
        graph.axes.plot(x,
                        data,
                        label=lbl,
                        linewidth=1.5,
                        marker=markers[0] if marker is None else marker)
    else:
        for i in range(len(data)):
            graph.axes.plot(x,
                            data[i],
                            label=lbl[i],
                            linewidth=1.5,
                            marker=markers_list[markers_idx[i]]
                            if marker is None else marker)
    graph.set_legend_pos(settings.legend_position)
    plt.savefig(file_name, bbox_inches='tight')
    plt.show()
示例#2
0
def motion_point_graph(data,
                       func,
                       lbl=None,
                       file_name="",
                       x_label="",
                       y_label="",
                       title=""):
    """
    Функция построения графика движения точки.
    На фоне располагается график изолиний тестовой функции.
    Положение зонда(точки) изображается красными точками на графике.
    Каждое положение соединяется стрелкой со следующим с указанием направления перемещения точки.
    :param data      : координаты точек.
    :param func      : тестовая функция, в виде вызываемого объекта.
    :param lbl       : подпись для точек.
    :param file_name : название файла для сохранения графика.
    :param x_label   : подпись оси X.
    :param y_label   : подпись оси Y.
    :param title     : название графика.
    :return: None
    """
    h = 0.2
    delta = 0.5
    l = 2
    data = np.array(data)
    graph = Graph()
    settings = Settings()
    if settings.dimension != 2:
        raise ValueError(
            "График движения точки строиться для функции двух переменных.")
    with open(settings.abs_path_test_func, 'r') as f:
        tf = json.load(f)
    constraints_x = [tf['constraints_down'][0], tf['constraints_high'][0]]
    constraints_y = [tf['constraints_down'][1], tf['constraints_high'][1]]
    x, y, z, levels = make_contour_data(func, constraints_x, constraints_y, h,
                                        delta, l)
    plt.contour(x, y, z, levels=levels)

    arrowprops = {
        'arrowstyle': '-|>',
        'linewidth': 1.5,
        'fc': 'k',  # заливка
        'ec': 'k',  # контур
    }

    for i in range(len(data)):
        graph.axes.plot(data[i][:, 0],
                        data[i][:, 1],
                        label=lbl[i],
                        marker='o',
                        linestyle='')  # color='r'
        for j in range(len(data[i]) - 1):
            graph.axes.annotate('',
                                xy=(data[i][j + 1][0], data[i][j + 1][1]),
                                xytext=(data[i][j][0], data[i][j][1]),
                                arrowprops=arrowprops)

    graph.axes.grid()
    graph.set_labels(xlabel=x_label,
                     ylabel=y_label,
                     title=title,
                     legend_title="")
    graph.set_legend_pos(settings.legend_position)
    plt.savefig(file_name, bbox_inches='tight')
    plt.show()
示例#3
0
def graph_convergence_coord(data,
                            x,
                            lbl=None,
                            file_name=None,
                            x_label="",
                            y_label="",
                            title="",
                            single_graph=False,
                            marker=None):
    """
    Функция построения графика сходимости по координатам.
    Строит график изменения координат в зависимости от итераций.
    Пример вызова 1:
        x = [0, 1, 2, 3, 4, 5]  # номер итерации
        data = [[5, 5], [2.43, 4.7], [1.52, 4.61], [0.5, 4.56], [-1.1, 4.2], [-1.99, 4.01]]  # изменения координат
        labels = ["${x}{_0}$", "${x}{_1}$"]  # массив подписей к данным с использованием нотации TeX.
        graph_convergence_coord(data, x, lbl=labels, 
                                file_name="42.png", x_label="t", y_label="x", 
                                title="Сходимость алгоритма к глобальному экстремуму по координатам", 
                                single_graph=False)
    Пример вызова 2:
        x = [0, 1, 2, 3, 4, 5]  # номер итерации
        data = [[[5, 5], [2.43, 4.7], [1.52, 4.61], [0.5, 4.56], [-1.1, 4.2], [-1.99, 4.01]],
                [[5, 5], [2.5, 4.89], [1.38, 4.64], [-0.12, 4.27], [-1.76, 4.15], [-2.03, 3.98]]]
        labels = [["${x}{_0} GSA$", "${x}{_1} GSA$"], 
                  ["${x}{_0} SAC$", "${x}{_1} SAC$"]]
        graph_convergence_coord(data, x, lbl=labels, 
                                file_name="42.png", x_label="t", y_label="x", 
                                title="Сходимость алгоритма к глобальному экстремуму по координатам", 
                                single_graph=False)
    Если в последнем примере single_graph=False, то будет два графика отдельно для GSA и для SAC 
    (имена файлов в этом случае будут "42_0.png" и "42_1.png").
    Если же single_graph=True, то будет один график с 4-мя линиями.
    
    :param data         : список с данными.
    :param x            : одномерный список значений для рисок по оси X.
    :param lbl          : список подписей для линий.
    :param file_name    : название файла для сохранения графика, например : "42.png".
    :param x_label      : подпись оси X, в виде строки. 
    :param y_label      : подпись оси Y, в виде строки.
    :param title        : название графика.
    :param single_graph : флаг, если установлено False - график сходимоти для каждого набора будет свой,
                          если установлено значение True - все данные будут на одном графике.
    :return: None
    """
    graph = Graph()
    graph.set_params()
    settings = Settings()
    dim = settings.dimension
    markers = [
        'o', 'x', 'v', '^', '<', '>', 's', 'p', '*', 'h', 'H', '+', 'D', 'd',
        '|', '_'
    ]

    graph.set_labels(xlabel=x_label,
                     ylabel=y_label,
                     title=title,
                     legend_title="")

    data = np.array([np.array(d) for d in data])

    if 2 * len(data) > len(markers):
        markers_list = markers.append(markers[:(2 * len(data) - len(markers))])
    else:
        markers_list = markers
    markers_idx = generate_rand_int_list(2 * len(data))
    if len(data.shape) == 2 and data.shape[-1] == dim:
        if len(lbl) != dim:
            raise ValueError("Ожидается параметр lbl длиной " + str(dim) +
                             ", текущая длина " + str(len(lbl)))
        marker = '' if (marker is None) and (len(data) >= 15) else None
        for j in range(dim):
            graph.axes.plot(x,
                            data[:, j],
                            label=lbl[0][j],
                            linewidth=1.5,
                            marker=markers_list[markers_idx[j]]
                            if marker is None else marker)
    elif len(data.shape) == 2 and data.shape[-1] != dim:
        marker = '' if (marker is None) and (data.shape[-1] >= 15) else None
        for j in range(len(data)):
            graph.axes.plot(x,
                            data[j],
                            label=lbl[j],
                            linewidth=1.5,
                            marker=markers_list[markers_idx[j]]
                            if marker is None else marker)
    else:
        lbl = np.array(lbl)
        if lbl.shape[0] != len(data) or lbl.shape[-1] != dim:
            raise ValueError("Ожидается параметр lbl длиной " +
                             str(len(data)) + ", текущая длина " +
                             str(len(lbl)) + ", с подмассивами длиной " +
                             str(dim) + ", текущая длина подмассивов" +
                             str(lbl.shape[-1]))
        marker = '' if (marker is None) and (data.shape[-2] >= 15) else None
        for i in range(len(data)):
            for j in range(dim):
                graph.axes.plot(x,
                                data[i, :, j],
                                label=lbl[i][j],
                                linewidth=1.5,
                                marker=markers_list[markers_idx[dim * i + j]]
                                if marker is None else marker)
            if not single_graph:
                graph.set_legend_pos(settings.legend_position)
                # name = file_name[:file_name.find('.')] + "_" + str(i) + file_name[file_name.find('.'):]
                plt.savefig(file_name[i], bbox_inches='tight')
                plt.show()
                if i == len(data) - 1:
                    return
                else:
                    graph = Graph()
                    graph.set_labels(xlabel=x_label,
                                     ylabel=y_label,
                                     title=title,
                                     legend_title="")

    graph.set_legend_pos(settings.legend_position)
    plt.savefig(file_name, bbox_inches='tight')
    plt.show()