Пример #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 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()