def layout_mds(self, steps, distances, progress_callback=None, opt_from_curr=False): """Position the network components according to similarities among them. """ nodes = self.nodes() if distances == None or distances.dim != len(nodes): self.information('invalid or no distance matrix') return 1 p = self.plot() minStressDelta = 0 mdsRefresh = int(steps / 20) self.mdsStep = 1 self.stopMDS = False #~ distances.matrixType = core.SymMatrix.Symmetric mds = MDS()(distances) mds.optimize(10, projection.mds.SgnRelStress, 0) rect = self.data_rect() w_fr = rect.width() h_fr = rect.height() d_fr = math.sqrt(w_fr ** 2 + h_fr ** 2) x_mds, y_mds = zip(*mds.points) w_mds = max(x_mds) - min(x_mds) h_mds = max(y_mds) - min(y_mds) d_mds = math.sqrt(w_mds ** 2 + h_mds ** 2) self.set_node_coordinates(dict( (n, (nodes[n].x() * d_mds / d_fr, nodes[n].y() * d_mds / d_fr)) for n in nodes)) p.update_graph_layout() qApp.processEvents() if opt_from_curr: for i, u in enumerate(sorted(nodes.keys())): mds.points[i][0] = nodes[u].x() mds.points[i][1] = nodes[u].y() else: mds.Torgerson() mds.optimize(steps, projection.mds.SgnRelStress, minStressDelta, progressCallback= lambda a, b=None, mds=mds, mdsRefresh=mdsRefresh, progress_callback=progress_callback: self.mds_callback(a, b, mds, mdsRefresh, progress_callback)) self.mds_callback(mds.avgStress, 0, mds, mdsRefresh, progress_callback) if progress_callback is not None: progress_callback(mds.avgStress, self.mdsStep) return 0
def layout_fragviz(self, steps, distances, graph, progress_callback=None, opt_from_curr=False): """Position the network components according to similarities among them. """ if distances == None or graph == None or distances.dim != graph.number_of_nodes(): self.information('invalid or no distance matrix') return 1 p = self.plot() edges = self.edges() nodes = self.nodes() avgLinkage = True rotationOnly = False minStressDelta = 0 mdsRefresh = 10#int(steps / 20) self.mdsStep = 1 self.stopMDS = False nodes_inds = dict((n, i) for i, n in enumerate(sorted(graph.nodes_iter()))) inds_nodes = dict((i, n) for i, n in enumerate(sorted(graph.nodes_iter()))) graph_components = nx.algorithms.connected_components(graph) matrix_components = [[nodes_inds[n] for n in c] for c in graph_components] #~ distances.matrixType = core.SymMatrix.Symmetric # scale net coordinates if avgLinkage: distances = distances.avgLinkage(matrix_components) # if only one component if distances.dim == 1: return 0 mds = MDS()(distances) rect = self.data_rect() w_fr = rect.width() h_fr = rect.height() d_fr = math.sqrt(w_fr ** 2 + h_fr ** 2) x_mds, y_mds = zip(*mds.points) w_mds = max(x_mds) - min(x_mds) h_mds = max(y_mds) - min(y_mds) d_mds = math.sqrt(w_mds ** 2 + h_mds ** 2) # if only one component if d_mds == 0 or d_fr == 0: d_mds = 1 d_fr = 1 self.set_node_coordinates(dict((key, (node.x() * d_mds / d_fr, node.y() * d_mds / d_fr)) \ for key, node in nodes.items())) p.update_graph_layout() qApp.processEvents() if opt_from_curr: if avgLinkage: for u, c in enumerate(graph_components): x = sum([nodes[n].x() for n in c]) / len(c) y = sum([nodes[n].y() for n in c]) / len(c) mds.points[u][0] = x mds.points[u][1] = y else: for i, u in enumerate(sorted(nodes.keys())): mds.points[i][0] = nodes[u].x() mds.points[i][1] = nodes[u].y() else: mds.Torgerson() mds.optimize(steps, projection.mds.SgnRelStress, minStressDelta, progressCallback= lambda a, b=None, mds=mds, mdsRefresh=mdsRefresh, graph_comp=graph_components, matrix_comp=matrix_components, progress_callback=progress_callback: self.fragviz_callback(a, b, mds, mdsRefresh, graph_comp, matrix_comp, progress_callback)) self.fragviz_callback(mds.avgStress, 0, mds, mdsRefresh, graph_components, matrix_components, progress_callback) if progress_callback is not None: progress_callback(mds.avgStress, self.mdsStep) return 0