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()
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()