def set_vertices(self, **vertex_options): """ Sets the vertex plotting parameters for this GraphPlot. This function is called by the constructor but can also be called to make updates to the vertex options of an existing GraphPlot object. Note that the changes are cumulative. EXAMPLES:: sage: g = Graph({}, loops=True, multiedges=True, sparse=True) sage: g.add_edges([(0,0,'a'),(0,0,'b'),(0,1,'c'),(0,1,'d'), ... (0,1,'e'),(0,1,'f'),(0,1,'f'),(2,1,'g'),(2,2,'h')]) sage: GP = g.graphplot(vertex_size=100, edge_labels=True, color_by_label=True, edge_style='dashed') sage: GP.set_vertices(talk=True) sage: GP.plot() sage: GP.set_vertices(vertex_colors='pink', vertex_shape='^') sage: GP.plot() """ # Handle base vertex options voptions = {} for arg in vertex_options: self._options[arg] = vertex_options[arg] # First set defaults for styles vertex_colors = None if self._options['talk']: voptions['markersize'] = 500 if self._options['partition'] is None: vertex_colors = '#ffffff' else: voptions['markersize'] = self._options['vertex_size'] if 'vertex_colors' not in self._options or self._options['vertex_colors'] is None: if self._options['partition'] is not None: from sage.plot.colors import rainbow,rgbcolor partition = self._options['partition'] l = len(partition) R = rainbow(l) vertex_colors = {} for i in range(l): vertex_colors[R[i]] = partition[i] elif len(self._graph._boundary) != 0: vertex_colors = {} bdy_verts = [] int_verts = [] for v in self._graph.vertex_iterator(): if v in self._graph._boundary: bdy_verts.append(v) else: int_verts.append(v) vertex_colors['#fec7b8'] = int_verts vertex_colors['#b3e8ff'] = bdy_verts elif not vertex_colors: vertex_colors='#fec7b8' else: vertex_colors = self._options['vertex_colors'] if 'vertex_shape' in self._options: voptions['marker'] = self._options['vertex_shape'] if self._graph.is_directed(): self._vertex_radius = sqrt(voptions['markersize']/pi) self._arrowshorten = 2*self._vertex_radius if self._arcdigraph: self._vertex_radius = sqrt(voptions['markersize']/(20500*pi)) voptions['zorder'] = 7 if not isinstance(vertex_colors, dict): voptions['facecolor'] = vertex_colors if self._arcdigraph: self._plot_components['vertices'] = [circle(center, self._vertex_radius, fill=True, facecolor=vertex_colors, clip=False) for center in self._pos.values()] else: self._plot_components['vertices'] = scatter_plot( self._pos.values(), clip=False, **voptions) else: # Color list must be ordered: pos = [] colors = [] for i in vertex_colors: pos += [self._pos[j] for j in vertex_colors[i]] colors += [i]*len(vertex_colors[i]) # If all the vertices have not been assigned a color if len(self._pos)!=len(pos): from sage.plot.colors import rainbow,rgbcolor vertex_colors_rgb=[rgbcolor(c) for c in vertex_colors] for c in rainbow(len(vertex_colors)+1): if rgbcolor(c) not in vertex_colors_rgb: break leftovers=[j for j in self._pos.values() if j not in pos] pos+=leftovers colors+=[c]*len(leftovers) if self._arcdigraph: self._plot_components['vertices'] = [circle(pos[i], self._vertex_radius, fill=True, facecolor=colors[i], clip=False) for i in range(len(pos))] else: self._plot_components['vertices'] = scatter_plot(pos, facecolor=colors, clip=False, **voptions) if self._options['vertex_labels']: self._plot_components['vertex_labels'] = [] # TODO: allow text options for v in self._nodelist: self._plot_components['vertex_labels'].append(text(str(v), self._pos[v], rgbcolor=(0,0,0), zorder=8))
def set_vertices(self, **vertex_options): """ Sets the vertex plotting parameters for this GraphPlot. This function is called by the constructor but can also be called to make updates to the vertex options of an existing GraphPlot object. Note that the changes are cumulative. EXAMPLES:: sage: g = Graph({}, loops=True, multiedges=True, sparse=True) sage: g.add_edges([(0,0,'a'),(0,0,'b'),(0,1,'c'),(0,1,'d'), ... (0,1,'e'),(0,1,'f'),(0,1,'f'),(2,1,'g'),(2,2,'h')]) sage: GP = g.graphplot(vertex_size=100, edge_labels=True, color_by_label=True, edge_style='dashed') sage: GP.set_vertices(talk=True) sage: GP.plot() sage: GP.set_vertices(vertex_colors='pink', vertex_shape='^') sage: GP.plot() """ # Handle base vertex options voptions = {} for arg in vertex_options: self._options[arg] = vertex_options[arg] # First set defaults for styles vertex_colors = None if self._options['talk']: voptions['markersize'] = 500 if self._options['partition'] is None: vertex_colors = '#ffffff' else: voptions['markersize'] = self._options['vertex_size'] if 'vertex_colors' not in self._options: if self._options['partition'] is not None: from sage.plot.colors import rainbow, rgbcolor partition = self._options['partition'] l = len(partition) R = rainbow(l) vertex_colors = {} for i in range(l): vertex_colors[R[i]] = partition[i] elif len(self._graph._boundary) != 0: vertex_colors = {} bdy_verts = [] int_verts = [] for v in self._graph.vertex_iterator(): if v in self._graph._boundary: bdy_verts.append(v) else: int_verts.append(v) vertex_colors['#fec7b8'] = int_verts vertex_colors['#b3e8ff'] = bdy_verts elif not vertex_colors: vertex_colors = '#fec7b8' else: vertex_colors = self._options['vertex_colors'] if 'vertex_shape' in self._options: voptions['marker'] = self._options['vertex_shape'] if self._graph.is_directed(): self._vertex_radius = sqrt(voptions['markersize'] / pi) self._arrowshorten = 2 * self._vertex_radius if self._arcdigraph: self._vertex_radius = sqrt(voptions['markersize'] / (20500 * pi)) voptions['zorder'] = 7 if not isinstance(vertex_colors, dict): voptions['facecolor'] = vertex_colors if self._arcdigraph: self._plot_components['vertices'] = [ circle(center, self._vertex_radius, fill=True, facecolor=vertex_colors, clip=False) for center in self._pos.values() ] else: self._plot_components['vertices'] = scatter_plot( self._pos.values(), clip=False, **voptions) else: # Color list must be ordered: pos = [] colors = [] for i in vertex_colors: pos += [self._pos[j] for j in vertex_colors[i]] colors += [i] * len(vertex_colors[i]) # If all the vertices have not been assigned a color if len(self._pos) != len(pos): from sage.plot.colors import rainbow, rgbcolor vertex_colors_rgb = [rgbcolor(c) for c in vertex_colors] for c in rainbow(len(vertex_colors) + 1): if rgbcolor(c) not in vertex_colors_rgb: break leftovers = [j for j in self._pos.values() if j not in pos] pos += leftovers colors += [c] * len(leftovers) if self._arcdigraph: self._plot_components['vertices'] = [ circle(pos[i], self._vertex_radius, fill=True, facecolor=colors[i], clip=False) for i in range(len(pos)) ] else: self._plot_components['vertices'] = scatter_plot( pos, facecolor=colors, clip=False, **voptions) if self._options['vertex_labels']: self._plot_components['vertex_labels'] = [] # TODO: allow text options for v in self._nodelist: self._plot_components['vertex_labels'].append( text(str(v), self._pos[v], rgbcolor=(0, 0, 0), zorder=8))